LeetCode 解题心得,欢迎交流!
原题:给定链表,从列表的末尾删除第n个节点并返回其头。
解题思路:关键是如何找到倒数第n个节点,定义两个指针fast和slow,让fast先走n步,
然后让fast和slow一起走,直到fast走到链表结尾,此时,slow指向倒数第n个节点的前一个节点,
然后,slow->next=slow->next->next,就可以跳过倒数第n个节点了,相当于删除了倒数第n个节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode *fast=head;
struct ListNode *slow=head;
int i;
for(i=0;i<n;i++)
{
fast=fast->next;
if(fast == NULL) return head->next;
}
while(fast->next != NULL)
{
fast=fast->next;
slow=slow->next;
}
slow->next=slow->next->next;
return head;
}
注意细节:怎么样走到第n-1个节点,你要注意题目已经告诉我们要删除的节点数是有效的,
所以,我们不必考虑万一要删除的节点数大于节点总数。如果要删除的节点为头结点怎么办,
有一个小的细节必须注意,如果要删除的节点是头结点,那么此时的fast肯定到了链表尾,所以我们只需要返回return head->next即可。
if(fast == NULL) return head->next;