力扣刷题4——删除链表的倒数第 N 个结点[双指针]
- 一、博客声明
- 二、题目描述
- 三、解题思路
- 1、思路说明
- 四、解题代码(附注释)
一、博客声明
找工作逃不过刷题,为了更好的督促自己学习以及理解力扣大佬们的解题思路,开辟这个系列来记录。代码可能不是自己写的,不求方法最好,只求更多地理解大佬们的解题思路。
二、题目描述
给你一个链表,删除链表的倒数第 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
三、解题思路
1、思路说明
这题使用双指针的方法来解决, 就只需要遍历一次链表,就能找到要找的位置进行删除。在这个过程中我们有del
和end
指针,遍历的时候,用while
把end
一直要遍历到最后一个节点,而我们只需要做的是,保证del
与end
之间存在n
间隔就可以。while
结束后,直接del->next = del->next->next
解决。
四、解题代码(附注释)
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode* preHead = malloc(sizeof(struct ListNode));//建立一个检测头
preHead->val = 0;
preHead->next = head;
struct ListNode* del = preHead;//要删除的位置前一个位置指针
struct ListNode* end = preHead;//跑到链表最后位置的指针
int count = 0;
if(head->next == NULL){//如果链表只有一个节点,直接返回NULL
return NULL;
}
while(end->next){//一直循环到链表最后的位置
end = end->next;
count++;
if(count > n){//当del与end间隔n的时候,del也开始移动,与end保持n的间隔
del = del->next;
}
}
del->next = del->next->next;//删除指定节点
struct ListNode* result = preHead->next;//新建result指向头
free(preHead);//释放分配的内存
return result;
}