【LeetCode】19. Remove Nth Node From End of List C语言

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; 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值