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;}
}