汇芳书院

专注计算机视觉、机器学习、分布式计算等领域, 兼聊投资、写作、生活

0%

链表的倒数第K个节点(系列)

剑指 Offer 22. 链表中倒数第k个节点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

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

 

示例:

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

返回链表 4->5.


双指针法

让fast和slow均指向dummy,然后先让fast走k步,然后二者一起走,k为NULL时,slow到达目的地。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* 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) {
if (k <= 0) {
return NULL;
}
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode *fast = dummy, *slow = dummy;
while (k > 0 && fast != NULL) {
fast = fast->next;
k--;
}
if (fast == NULL) {
return NULL;
}
while (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
return slow;

}
};

19. 删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:

输入:head = [1], n = 1
输出:[]
示例 3:

输入:head = [1,2], n = 1
输出:[1]  

提示:

链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz


双指针思路

先让一个节点early早点出发,先走N步,然后再让另一个节点normal一起走。
当early节点走到链表结尾的时候,另一个节点normal就是需要被删除的节点。
注意记录normal节点的上一个节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
dummy = ListNode()
dummy.next = head

early = dummy
while early and n > 0:
early = early.next
n = n - 1

normal = dummy
prev = dummy
while early:
prev = normal
normal = normal.next
early = early.next
# print(early, normal)
prev.next = normal.next
del normal
return dummy.next

使用栈

计算长度

坚持原创分享,您的支持将鼓励我继续创作

欢迎关注我的其它发布渠道

------------- 本文结束,感谢阅读 如有问题可留言交流 -------------