题目描述:
给你一个链表,删除链表的倒数第 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]
提示:
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
题目分析:
就是一个简单的遍历。如果不嫌麻烦的话,可以进行两次遍历,第一次确定链表结点的数量len,第二次删掉第len+1-n个节点。如果在第一次便利的时候记住每个节点的地址的话,那么不用遍历就可以删掉第len+1-n个节点。
代码:
//给的链表是没有头结点的
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode* ptr[100];//ptr[i]指向链表第i+1个节点
struct ListNode* p=head;
int len=0;//记录节点数量
while(p)
{
ptr[len]=p;
len++;
p=p->next;
}//最后一个被赋值的是ptr[len-1],ptr[len]没有被赋值,也就是取不到,除非后面加上ptr[len]=NULL
// ptr[len]=NULL;
// if(len==1&&n==1) return NULL;
if(head==NULL) return head;
if(n==len)
{
p=head;
head=head->next;
free(p);
}
else
{
p=ptr[len-n];//指向倒数第n个节点
// ptr[len-n-1]->next=ptr[len-n+1];//因为ptr[len]没有被赋值,所以当n==1时,ptr[len-n+1]会出错
ptr[len-n-1]->next=ptr[len-n]->next;
free(p);
}
return head;
}