目录
1.题目
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1 输出:[]
示例 3:
输入:head = [1,2], n = 1 输出:[1]
2.思路
这道题可以先遍历一遍,得到链表中的节点个数,然后在计算出要删除的节点的位置,从而删除该节点。也可以只遍历一遍,做法有点像找中间节点的题目,先定义快慢指针都指向链表头(slow 和 fast),先让fast走n步,然后fast和slow同时往前走,直到fast为空,这时slow指向的节点就是要删除的节点,然后删除该节点就可以了。
3.图解
删除倒数第二个节点:
1.fast向前走两步:
2.当fast走到NULL的位置时,slow刚好指向要删除的节点:
4.代码
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
if(head==NULL){
return NULL;
}
struct ListNode* slow=head;
struct ListNode* fast=head;
struct ListNode* record=head;//记录slow上一次的位置,用来删除slow指向的节点
while(n&&fast){
fast=fast->next;
n--;
}
if(fast==NULL){//说明此时要删除的节点是头节点,需要改变head的指向
head=head->next;
}
while(fast){
record=slow;
fast=fast->next;
slow=slow->next;
}
record->next=slow->next;
free(slow);
return head;
}
以上代码需要注意一点,当走完第一个循环后fast为空,此时说明要删除的节点是链表的第一个节点,那么就需要改变头指针head的指向。