前言
本文介绍关于链表中倒数第k个节点的相关问题,剑指 Offer 22. 链表中倒数第k个节点,LC.19 删除链表的倒数第 N 个结点 。
剑指 Offer 22. 链表中倒数第k个节点
思路:
利用快慢指针技巧,先让快指针走 k 步,然后快慢指针开始同速前进,这样当快指针走到链表末尾 null 时,慢指针所在的位置就是倒数第 k 个链表节点。
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode fast,slow;
fast = slow = head;
while(k --> 0){
fast = fast.next;
}
while(fast != null){
fast = fast.next;
slow = slow.next;
}
return slow;
}
}
LC.19 删除链表的倒数第 N 个结点
思路:
- 设置变量:三指针(fast、slow、prev)初始化为head,链表长度(size)初始化为0;
- fast 指针先走 k 步,同时 size++;
- fast 、slow 同速前进,用 prev 记录 slow 的前一个位置(删除时用),同时 size++;
- 分情况删除:
a.删除头
b.删除尾
c.删除头尾之间任意一个
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head == null || head.next == null)
return null;
int nn = n;
ListNode slow,fast,prev;
prev = slow = fast = head;
int size = 0;
while(n --> 0){
fast = fast.next;
size++;
}
while(fast != null){
prev = slow;
slow = slow.next;
fast = fast.next;
size++;
}
if(nn == size)
head = head.next;
if(slow.next != null){
prev.next = slow.next;
}else{
prev.next = null;
}
return head;
}
}