题目:
19. 删除链表的倒数第 N 个结点https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
难度中等176
给你一个链表,删除链表的倒数第 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
进阶:你能尝试使用一趟扫描实现吗?
结果:
合并:
分开:
解题思路:
用两个指针,q 和 p ,刚开始都等于head;
1,移动 p,使 p 和 q相差 n个数据。
2,移动 p 和 q,让p指向最后一个数字或者NULL(当数据量小于2的时候,可能指向NULL)
3,当 p 等于null的时候,释放第一个节点,head指向head的next;
当 p->next 等于null的时候,释放 q 后面哪一个节点。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode *q = head;
struct ListNode *p = q;
//for(int i = 0; i < n; i++, p = p->next);
//for(; p && p->next; p = p->next, q = q->next);
//将上面两个for合并之后
for(int i = 0; i < n || (p && p->next); p = p->next) {
if(i == n) {
q = q->next;
} else {
i++;
}
}
if(!p) {
head = head->next;
free(q);
} else {
p = q->next;
q->next = p != NULL ? p->next : p;
free(p);
}
return head;
}