一、题目:
19.删除链表中倒数第n个结点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
二、思路:
首先遍历一遍链表,获得链表长度length。再遍历第二次链表,采用cnt计数,当cnt=length-n时,删除当前指向的下一个结点。
三、代码(C++):
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *p=head;
ListNode *q=head;
int length=0;
int cnt=0;
while(p)
{
++length;
p=p->next;
}
if(length==n)
{
head=head->next;
return head;
}
while(q)
{
++cnt;
if(cnt==length-n)
{
q->next=q->next->next;
break;
}
q=q->next;
}
return head;
}
四、扩展:只遍历一次链表
首先用一个指针向前走n+1个位置,然后让第二个指针和第一个一起向后遍历,直到第一个指针为空。删除第二个指针指向的下一个结点。
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *h=new ListNode(0);
h->next=head;
head=h;
ListNode *p=h,*q=h;
for(int i=1;i!=n+2;i++)
{
p=p->next;
}
while(p)
{
q=q->next;
p=p->next;
}
q->next=q->next->next;
return head->next;
}