资讯详情

【算法leetcode】剑指 Offer 22. 链表中倒数第k个节点(多语言实现)


文章目录

  • 剑指 Offer 22. 链表倒数第K节点:
  • 样例 1:
  • 分析
  • 题解
    • rust
    • go
    • typescript
    • python
    • c
    • c
    • java
  • 原题传送门:https://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/


剑指 Offer 22. 链表倒数第K节点:

输入链表,输出链表中倒数第K节点。为了满足大多数人的习惯,这个问题从1开始计数,即链表的尾节点是倒数第一节点。

例如,链表有 6 从头节点开始,它们的值依次是 1、2、3、4、5、6。链表倒数第 3 节点值为 4 的节点。

样例 1:

给定一个链表:   1->2->3->4->5, 和 k = 2.  返回链表   4->5. 

分析

  • 面对这个算法题目,二当家陷入沉思。
  • 这个问题并不难做到。首先,你可以通过第一次得到链表的长度,你可以知道目标节点是第二个节点,第二次得到目标节点。
  • 也可以一次遍历,比如用一个数组,一边遍历一边把节点拉平到数组,遍历结束后就知道节点下标了。
  • 也可以使用常数级别的额外空间。使用快指针和慢指针,让快指针提前通过K个节点,然后让快指针继续通过,直到快指针到链表的末端,慢指针是目标节点。

题解

rust

// Definition for singly-linked list. // #[derive(PartialEq, Eq, Clone, Debug)] // pub struct ListNode { 
         // pub val: i32, // pub next: Option<Box<ListNode>> // } //  // impl ListNode { 
         // #[inline] // fn new(val: i32) -> Self { 
         // ListNode { 
         // next: None, // val // } // } // } impl Solution { 
             pub fn get_kth_from_end(head: Option<Box<ListNode>>, k: i32) -> Option<Box<ListNode>> { 
                 let mut ans = head;         let mut fast = ans.clone();         for _ in 0..k { 
                     fast = fast.unwrap().next;         }         while fast.is_some() { 
        
            fast = fast.unwrap().next;
            ans = ans.unwrap().next;
        }
        ans
    }
}

go

/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */
func getKthFromEnd(head *ListNode, k int) *ListNode { 
        
    ans := head
	fast := head
	for k > 0 { 
        
		fast = fast.Next
        k--
	}
	for fast != nil { 
        
		fast = fast.Next
		ans = ans.Next
	}
	return ans
}

typescript

/** * Definition for singly-linked list. * class ListNode { * val: number * next: ListNode | null * constructor(val?: number, next?: ListNode | null) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } * } */

function getKthFromEnd(head: ListNode | null, k: number): ListNode | null { 
        
    let ans = head;
	let fast = head;
	while (--k >= 0) { 
        
		fast = fast.next;
	}
	while (fast) { 
        
		fast = fast.next;
		ans = ans.next;
	}
	return ans;
};

python

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution:
    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
        ans = head
        fast = head
        for _ in range(k):
            fast = fast.next
        while fast:
            fast = fast.next
            ans = ans.next
        return ans


c

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */


struct ListNode* getKthFromEnd(struct ListNode* head, int k){ 
        
    struct ListNode *ans = head;
    struct ListNode *fast = head;
    while (--k >= 0) { 
        
        fast = fast->next;
    }
    while (fast) { 
        
        fast = fast->next;
        ans = ans->next;
    }
    return ans;
}

c++

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */
class Solution { 
        
public:
    ListNode* getKthFromEnd(ListNode* head, int k) { 
        
        ListNode *ans = head;
        ListNode *fast = head;
        while (--k >= 0) { 
        
            fast = fast->next;
        }
        while (fast) { 
        
            fast = fast->next;
            ans = ans->next;
        }
        return ans;
    }
};

java

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */
class Solution { 
        
    public ListNode getKthFromEnd(ListNode head, int k) { 
        
        ListNode ans  = head;
        ListNode fast = head;
        while (--k >= 0) { 
        
            fast = fast.next;
        }
        while (fast != null) { 
        
            fast = fast.next;
            ans = ans.next;
        }
        return ans;
    }
}

原题传送门:https://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/


非常感谢你阅读本文~ 欢迎【点赞】【收藏】【评论】~ 放弃不难,但坚持一定很酷~ 希望我们大家都能每天进步一点点~ 本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


标签: 风门开闭状态传感器kge22

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台