给你一个链表,删除链表的倒数第 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]
思路:首先要找到待删的结点位置
1.可以先计算整个链表的长度,然后就可以让遍历的指针指到待删结点的前一个结点
2.也可以用快慢指针解决,也是找到待删结点的前一个
方法1:
int List(struct ListNode* head){
struct ListNode* cur=head;
int size=0;
while(cur){
cur=cur->next;
size++;
}
return size;
}
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode* newhead=(struct ListNode*)malloc(sizeof(struct ListNode));
newhead->next=head;
struct ListNode* cur=newhead;
int size=List(head);
//让cur走到待删结点的前一个
for(int i=0;i<=size-n-1;++i){
cur=cur->next;
}
//跳过待删结点
cur->next=cur->next->next;
return newhead->next;
}
方法2:
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode* newhead=(struct ListNode*)malloc(sizeof(struct ListNode));
newhead->next=head;
struct ListNode* fist=newhead;
struct ListNode* slow=newhead;
//k<0或者链表为空时返回NULL;
if(n<=0||head==NULL) return NULL;
//让fist先走k个结点
for(int i=0;i<n+1;++i){
//防止k大于总结点个数,会人fist提前到达NULL;也返回NULL;
if(fist==NULL){
return NULL;
}
fist=fist->next;
}
//在fist到达NULL之前,快慢指针一起走
while(fist){
fist=fist->next;
slow=slow->next;
}
//此时slow的下一个就是待删结点
slow->next=slow->next->next;
return newhead->next;
}