第一步先遍历一遍链表,确定链表的长度;接着定位待删除节点的前一个节点。
class Solution
{
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
int lenth=0;
ListNode *p=head;
while(p!=NULL)
{
lenth++;
p=p->next;
} //get the lenth of the linklist
if(n==lenth)
return head->next;
else
{
int flag=1;
ListNode *link=head;
//ListNode *list=link;
while(flag!=(lenth-n))
{
flag++;
link=link->next;
} //point to the pre-node of the node-todeleted
link->next=link->next->next;
return head;
}
}
};
实际上,如果题目要求只遍历一遍链表,那么可采用双指针(快慢指针)的左法,即为:分别定义一个快、慢指针,让快指针先移动N步,接着快慢指针一起移动,当快指针到达链表尾端时,慢指针恰好处于待删除节点的上一个节点。
PS:在处理链表问题中,往往对链表的遍历次数有要求,对于该类问题,较为通用的解决办法就是使用双指针的算法,可以有效解决诸如发现链表环,找到多链表公共节点等问题,可以降低一定的时间成本。