Loading

力扣 - 19. 删除链表的倒数第N个节点

题目

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

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

思路1

  • 创建哑结点,比较好控制如果就一个元素的情况
  • 获取总长度,总长度减去n就是我们链表整数的那个结点的后一个要删除

代码实现

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //创建哑结点
        ListNode dummy = new ListNode(0);
        //将哑结点和链表连接起来
        dummy.next = head;
        ListNode cur = dummy;
        ListNode p = head;
        //计算链表的总长度
        int len = 0;
        while (p != null) {
            p = p.next;
            len++;
        }
        //正向移动n即可到达要删除的结点的前一个结点
        n = len - n;
        for (int i = 0; i < n; i++) {
            cur = cur.next;
        }
        //删除结点
        cur.next = cur.next.next;
        return dummy.next;
    }
}

思路2

  • 利用双指针来进行
  • 创建一个哑结点作为头部,这样子如果链表就一个元素也就比较好删除
  • fast指针为null就是到达链表末尾
    • 要删除的结点为n,由于我们获取的是前一个结点,然后通过slow.next = slow.next.next这样来删除结点的,因此slow和fast的间隔要比n大一个,即i < n + 1

代码实现

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //哑结点
        ListNode dummy = new ListNode(0);
        //哑结点和链表连接起来
        dummy.next = head;
        ListNode fast = dummy;
        ListNode slow = dummy;
        //将fast后移n+1位
        for (int i = 0; i < n + 1; i++) {
            fast = fast.next;
        }
        //判断fast是否到达最后一个元素的后面,即null,如果就一个元素,直接不进入循环
        while (fast != null) {
            fast = fast.next;
            slow = slow.next;
        }
        //删除结点
        slow.next = slow.next.next;
        return dummy.next;
    }
}
posted @ 2020-10-15 00:45  linzeliang  阅读(109)  评论(0)    收藏  举报