给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list
示例 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]
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int val=0, ListNode next=null) {
* this.val = val;
* this.next = next;
* }
* }
*/
public class Solution {
public ListNode RemoveNthFromEnd(ListNode head, int n) {
ListNode dummyNode = new ListNode(0);
dummyNode.next = head;
ListNode slow = dummyNode;
ListNode fast = head;
int cnt = n-1;
while (fast.next != null)
{
fast = fast.next;
if (cnt == 0)
{
slow = slow.next;
}
else
{
cnt--;
}
}
slow.next = slow.next.next;//尤其注意!!!!!!
return dummyNode.next;
}
}
总结:这道题采用快慢指针,我犯的错误是:1.当删除节点fast前一个节点时,我选择了让slow.next=fast,如果slow和fast之间间隔了至少一个节点,没有问题,如果删除的节点刚好是fast,那么slow.next=fast会导致没删掉。下次在链表中删除节点时要注意,直接用slow的节点.next.next来赋给slow就好了,不要被想要删除节点的指针名字所迷惑,导致节点相邻时无法删除的情况。
2.方法结束后返回链表头节点时我写的是return head;就会出现如果删除的是头节点,我只是让虚拟头节点dummyNode指向了空,并没有实际改变head的值;下次要记得:使用虚拟头节点时返回链表时要返回dummyNode.next