做题总结 19. 删除链表的倒数第 N 个结点(快慢指针思想)

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

做题总结 19. 删除链表的倒数第 N 个结点(快慢指针思想)_第1张图片

进阶

题目进阶:你能尝试使用一趟扫描实现吗?

在这里插入图片描述
思路
① 如果要删除4节点,那么指针一定是要指在3节点处,才能达到删除目的。
② 还是使用虚拟头节点:优势为,不需要对操作的节点进行头结点的判断,可以用统一的方式删除。
③ 如何找到倒数第n个节点。快慢指针。

做题总结 19. 删除链表的倒数第 N 个结点(快慢指针思想)_第2张图片
代码随想录中,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;
    }
}

做题总结 19. 删除链表的倒数第 N 个结点(快慢指针思想)_第3张图片

你可能感兴趣的:(LeetCode做题总结,leetcode)