依旧是链表的应用
最开始看到这道题的时候,想法很暴力,遍历一遍得到长度,然后再遍历一遍删除指定元素。后来看来大佬的题解发现可以使用双指针的方法,只需要一次遍历就可以删除指定节点。
需要注意的一点是,虽然题目中已经说明 n 是有效数字,但是依旧有可能出现 fast 指针为空的情况,即删除第一个元素的时候。这个时候只需要返回 head->next 就可以了,之后就可以愉快的写代码了!
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
if(head == NULL || head->next == NULL){
return NULL;
}
struct ListNode* fast = head;
struct ListNode* slow = head;
for(int i = 0;i < n; i++){
fast = fast->next;
}
if(!fast){
return head->next;
}
while(fast->next){
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return head;
}
本文介绍了一种高效的链表操作方法,通过使用双指针技术,仅需一次遍历即可实现从链表中删除倒数第N个节点,避免了两次遍历的低效方式。文章提供了详细的算法思路解析及代码实现。

被折叠的 条评论
为什么被折叠?



