Nameless Site

But one day, you will stand before its decrepit gate,without really knowing why.

0%

删除链表倒数第N个结点

来源于Leetcode第19题删除链表倒数第N个结点

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

最常见的思路就是两次遍历,第一次遍历先确定整个链表的长度,第二次遍历找到倒数第N个结点。
但是如果采用一次遍历的方法话,就会快很多,使用两个指针p,q,先让指针p前进n步,然后在让p、q同时前进,直到p来到最后一个结点,此时q的下一个结点就是要删除的结点,只需修改q的下一结点即可。
但是在提交时遇到了坑,当输入为[1],1时,会直接超时,查看评论,得知可以直接返回空,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
if(head -> next == NULL&&n == 1)
return NULL;
struct ListNode * p = head;
struct ListNode * q= head;
struct ListNode *temp;
for(int i =0;i<n;i++)
{
if(p -> next != NULL)
p=p->next;
else
return head->next;
}
while(p->next != NULL)
{

p=p->next;
q=q->next;
}
temp = q ->next;
q -> next = temp ->next;
free(temp);
temp = head;
return temp;
}