给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
直接把待删除指针前面的指针指向待删除指针后的指针就行了。但是需要注意的是为什么需要使用dummy,及快慢指针为什么是初始化为dummy。首先是因为最终需要返回的是头结点;其次因为需要考虑链表只有一个结点,然后删除后,链表为空。具体为什么也不是很清楚,只是如果不这样的话,遇到只有一个结点的情况会出错。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* fast = dummy;
ListNode* slow = dummy;
for (int i = 1; i <= n + 1; i++){
fast = fast->next;
}
while(fast != nullptr){
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dummy->next;
}
};