leetcode-master icon indicating copy to clipboard operation
leetcode-master copied to clipboard

19.删除链表的倒数第N个节点 Java版本 勘誤

Open Haoze0102 opened this issue 2 years ago • 3 comments

原版本

public ListNode removeNthFromEnd(ListNode head, int n){
    ListNode dummyNode = new ListNode(0);
    dummyNode.next = head;

    ListNode fastIndex = dummyNode;
    ListNode slowIndex = dummyNode;

    // 只要快慢指针相差 n 个结点即可
    for (int i = 0; i < n  ; i++){ 
        fastIndex = fastIndex.next;
    }

    while (fastIndex != null){
        fastIndex = fastIndex.next;
        slowIndex = slowIndex.next;
    }

    //此时 slowIndex 的位置就是待删除元素的前一个位置。
    //具体情况可自己画一个链表长度为 3 的图来模拟代码来理解
    slowIndex.next = slowIndex.next.next;
    return dummyNode.next;
}

實際應改為

public ListNode removeNthFromEnd(ListNode head, int n){
    ListNode dummyNode = new ListNode(0);
    dummyNode.next = head;

    ListNode fastIndex = dummyNode;
    ListNode slowIndex = dummyNode;

    // 只要快慢指针相差 n 个结点即可
    for (int i = 0; i < n + 1  ; i++){  //改為n+1
        fastIndex = fastIndex.next;
    }

    while (fastIndex != null){
        fastIndex = fastIndex.next;
        slowIndex = slowIndex.next;
    }

    //此时 slowIndex 的位置就是待删除元素的前一个位置。
    //具体情况可自己画一个链表长度为 3 的图来模拟代码来理解
    slowIndex.next = slowIndex.next.next;
    return dummyNode.next;
}

Haoze0102 avatar Dec 09 '23 07:12 Haoze0102

我也发现了这个问题 或者修改while的条件: while (fastIndex != null && fastIndex.next != null)

regancz avatar Mar 07 '24 10:03 regancz

我也发现这个问题,在不改动for循环的基础上,while循环也可以修改为: public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dummy = new ListNode(-1); dummy.next = head; ListNode fastNode = dummy; ListNode slowNode = dummy;

    for (int i = 0; i < n  ; i++){
        fastNode = fastNode.next;
    }
    while(fastNode.next != null){
        fastNode = fastNode.next;
        slowNode = slowNode.next;
    }
    slowNode.next = slowNode.next.next;
    return dummy.next;

}

eurakalee avatar Apr 09 '24 14:04 eurakalee

改动: 改变for循环添加 i<=n 使快慢指针之间相差n+1步,使慢指针指向被删除元素的上一个 原版: i<n 使快慢指针之间相差n步,使慢指针指向被删除元素 class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dumyNode = new ListNode(-1); dumyNode.next = head; ListNode slowNode = dumyNode; ListNode fastNode = dumyNode; for( int i = 0 ; i <= n; i++){ fastNode = fastNode.next; } while(fastNode != null){ fastNode = fastNode.next; slowNode = slowNode.next; } slowNode.next = slowNode.next.next; return dumyNode.next; } }

Aaaakkey avatar Apr 16 '24 03:04 Aaaakkey