题目连接:
删除链表的倒数第n个节点_牛客题霸_牛客网 (nowcoder.com)
题目描述:
描述
给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如,
给出的链表为: 1→2→3→4→5 , n=2.
删除了链表的倒数第 n 个节点之后,链表变为1→2→3→5
数据范围: 链表长度 0≤n≤1000,链表中任意节点的值满足 0≤val≤100
要求:空间复杂度 O(1),时间复杂度 O(n)
备注:
题目保证 n 一定是有效的
题目解法:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/*
*BM8 链表中倒数最后k个结点
描述
给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如,
给出的链表为: 1→2→3→4→5, n=2.
删除了链表的倒数第 n 个节点之后,链表变为 1→2→3→5.
数据范围: 链表长度 0≤n≤1000,链表中任意节点的值满足 0≤val≤100
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
备注:
题目保证 n 一定是有效的
*/
/**************************code*****************************************/
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* removeNthFromEnd(struct ListNode* head, int n ) {
// write code here
struct ListNode *pfast, *pslow;
struct ListNode *dummyHead = (struct ListNode *)malloc(sizeof(struct ListNode));
dummyHead->next = head;
pfast = dummyHead, pslow = dummyHead; //创建虚拟头节点,并且fast slow都指向dummy
for(int i=0; i<=n; i++){ //找到fast位置,注意此时slow和fast距离n+1
if(!pfast)return NULL;
pfast = pfast->next;
}
while(pfast){ //当fast没到末尾时,fast slow一起移动
pfast = pfast->next;
pslow = pslow->next;
}
//fast找到末尾时,slow在要删除的节点的前一个(前面的n+1),将slow的next指向next->next,跳过倒数n节点。
pslow->next = pslow->next->next;
return dummyHead->next;
}
/**************************end******************************************/
int main ()
{
struct ListNode LN15={5,NULL};
struct ListNode LN14={4,&LN15};
struct ListNode LN13={3,&LN14};
struct ListNode LN12={2,&LN13};
struct ListNode LN1 ={1,&LN12};
struct ListNode LN22 ={2,NULL};
struct ListNode LN2 ={1,&LN22};
struct ListNode* ret = removeNthFromEnd(&LN1, 2);
while(ret){
printf("-*-- %d \r\n", ret->val);
ret = ret->next;
}
return 0;
}