Loading

LeetCode刷题笔记—双指针题型集锦(19. 删除链表的倒数第 N 个结点)

19. 删除链表的倒数第 N 个结点(难度:中等)

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

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

示例 1:
输入: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

 

第一种方法:暴力解法

先遍历一遍链表,得到链表的长度length,然后再从头遍历length - n + 1的节点就是删除的节点

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0,head);
            int length = getLength(head);
            ListNode cur = dummy;
            for(int i = 0;i<length - n + 1;++i){
                cur = cur.next;
            }
            cur.next = cur.next.next;
            ListNode ans = dummy.next;
            return ans;
        }
        public int getLength(ListNode head){
            int length = 0;
            while(head != null){
                head = head.next;
                ++length;
            }
            return length;
    }
}

第二种方法:双指针

定义两个指针,一个快指针,一个慢指针,都从第一个节点开始遍历,让快指针比慢指针快n个节点,当快指针到末尾时,慢指针则刚好指向待删除的节点,我们引入一个哑节点,让慢指针指向哑节点,使得慢指针停在待删除节点的前驱节点,如果没有哑节点,若演示实例是head = [1],n = 1,这是slow指向head,slow.next = slow.next.next就会报错。

动画演示:(黄色方块即为哑节点)

演示动画来自:动画图解 LeetCode 第 19 号问题:删除链表的倒数第 N 个节点 - 删除链表的倒数第 N 个结点 - 力扣(LeetCode) (leetcode-cn.com)

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0,head);
            ListNode slow = dummy,fast = head;
            for(int i = 0;i<n;i++){
                fast = fast.next;
            }
            while(fast!= null){
                fast = fast.next;
                slow = slow.next;
            }
            slow.next = slow.next.next;
            ListNode ans = dummy.next;
            return ans;
    }
}

 

posted @ 2021-08-15 23:55  StormArcita  阅读(36)  评论(0)    收藏  举报