LeetCode#19 Remove Nth Node From End of List

本文介绍了一种高效删除链表中倒数第N个节点的方法。通过使用两个指针,一个快指针先向前移动N步,随后两个指针同步移动直至快指针到达链表末尾。此时慢指针指向待删除节点的前一个节点,从而实现O(n)时间内完成删除操作。

Given a linked list, remove the nth node from the end of list and return its head.

For example,

Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.

Note:
Given n will always be valid.
题意:意思是给定一个单链表,删除从表尾开始数的第n个数字,并返回删除后的链表。我开始的做法比较简单,先遍历一遍链表,得到总长len,然后再计算得到顺序删除的值len-n,最后在遍历一次删除。后来看了别人的解法:用两个指针,一个快指针先走n步,一个慢指针从头开始走,这样当快指针走到尾部的时候,慢指针所指的就是要删除元素的前一个元素。代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {   //两个指针操作
        ListNode *pre=head;
        ListNode *t1=head,*t2=head;
        int i=0;
        while(i<n)
        {
            t1=t1->next;
            i++;
        }
        if(t1==NULL)return head->next;
        while(t1!=NULL)
        {
            if(t2!=head)pre=pre->next;
            t1=t1->next;
            t2=t2->next;
        }
        pre->next=t2->next;
        return head;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值