LeetCode 19. Remove Nth Node From End of List(链表-双指针)
题目描述:
Given a linked list, remove the n-th node from the end of list and return its head.
Example:
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
思路分析
该题主要需要注意的点:1)删除的倒数第n个点距离结尾NULL的长度(快慢两指针需要确定的间隔);2)如果删除的是头结点如何(考虑用虚拟头结点知识);3)需要定位带待删除结点的上一个节点;4)注意输入有效性的判断以及内存释放
具体代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//该题目采用快慢指针(双指针的思想),同时有可能删除链表头结点,所以需要设置虚拟头结点
if(head==NULL||n<0)
return NULL;
//建立虚拟头结点
ListNode* dummy=new ListNode(0);
dummy->next=head;
//建立两个指针
ListNode* fast=dummy;
ListNode* slow=dummy;
//确定两指针中间应该隔开多少节点,快指针先行
for(int i=0;i<n+1;i++)
{ //判断一下,输入n是否合法
if(fast==NULL)
return NULL;
fast=fast->next;
}
//快慢指针同时走,直到快指针到NULL,此时慢指针指向就是删除节点的前一个节点。
while(fast)
{
fast=fast->next;
slow=slow->next;
}
//删除该节点
ListNode* del=slow->next;
slow->next=del->next;
delete del;
//释放内存
ListNode* res=dummy->next;
delete dummy;
return res;
}
};