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

284 阅读1分钟

题目描述

image.png

方法一:双指针,遍历一次

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode();
        dummy.next = head;
        ListNode slow = head, fast = head, pre = dummy;
        //fast先走n个距离
        for (int i = 0; i < n; i++) {
            fast = fast.next;
        }
        //三个指针都往后移动
        while (fast != null) {
            fast = fast.next;
            slow = slow.next;
            pre = pre.next;
        }
        //此时fast=null,fast和slow直接间隔为n-1,删除slow即可
        pre.next = slow.next;
        slow.next = null;
        return dummy.next;
    }
}

方法二:遍历两次,第一次求总长度,第二次定位到要删除的节点

class Solution {
    public ListNode deleteNode(ListNode head, int val) {
    ListNode dummy = new ListNode(0);//为了能删第一个元素,或者特殊处理第一个节点也行
    dummy.next = head;
    ListNode cur = dummy;
    while (cur != null) {
        if (cur.next.val == val) {
            cur.next = cur.next.next;
            break;
        } else {
            cur = cur.next;
        }
    }
    return dummy.next;
    }
}

当处理删除头节点时,有两种方法

  1. 使用dummynode,dummy.next = dummy.next.next

  2. 特判,直接返回head.next