19. 删除链表的倒数第 N 个结点
- 最初的想法
- 进阶
- 实现(Java)
最初的想法
计算出链表中的节点总数,然后遍历找到目标节点并删除。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode cur = head;
int count=0;
while(cur != null) {
count++;
cur = cur.next;
}
//题目中规定n是小于节点数的
ListNode dummyhead = new ListNode(0,head);
cur = dummyhead;
for(int i=0; i<count-n; i++) {
cur = cur.next;
}
cur.next = cur.next.next;
return dummyhead.next;
}
}
进阶
题目进阶:你能尝试使用一趟扫描实现吗?
思路
① 如果要删除4节点,那么指针一定是要指在3节点处,才能达到删除目的。
② 还是使用虚拟头节点:优势为,不需要对操作的节点进行头结点的判断,可以用统一的方式删除。
③ 如何找到倒数第n个节点。快慢指针。
代码随想录中,fast指针直到 null,作为结束,但是如果遵循【fast先动n步,slow和fast同时移动,直至fast.next=null】,也可以实现。
实现(Java)
下面代码的规则为:
① fast先移动n步
② slow和fast同时移动,直至 fast.next=null;
(请注意这里与代码随想录有些许不同)
③ slow.next = slow.next.next;
删除
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//虚拟头节点
ListNode dummyhead = new ListNode(-1,head);
ListNode slow,fast;
slow = fast = dummyhead;
//① fast先移动n步
for(int step = 1; step <= n; step++) {
fast = fast.next;
}
while(fast.next != null) {
slow = slow.next;//② slow和fast同时移动
fast = fast.next;
}
slow.next = slow.next.next;//删除节点
return dummyhead.next;
}
}