1. 问题描述
给定一个单链表,删除它的倒数第k个节点。例如给定链表: 1→2→3→4→5,删除它的倒数第二个节点后变为 1→2→3→5。可以假设倒数第k个节点总是存在。
2. 方法与思路
很容易想到第一种方法,就是先对单链表进行进行一次遍历,求出其长度n。然后再进行第二次遍历,设一个指针,向后移动n?k个位置,然后删除这个节点。
第二种方法就是使用双指针,只需要对链表进行一遍访问即可。
I. ListNode *p=*q=head
II. q指针后移k个位置
III. while q != end
p,q同时后移
IV. 删除p的下一个节点
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *pre=head,*end=head;
while(n--) end = end->next;
while(end && end->next) pre = pre->next,end = end->next;
if(end == NULL) return head->next;
else
{
ListNode *tmp = pre->next;
pre->next = tmp->next;
delete tmp;
}
return head;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-03 04:30:50