题解 | #删除链表的倒数第n个节点#

删除链表的倒数第n个节点

http://www.nowcoder.com/practice/f95dcdafbde44b22a6d741baf71653f6

思路

双指针,同等速度,但是出发点不一样(fast比slow多走n-1步骤)

注意要考虑到前一个节点,
注意要释放节点,拒绝内存泄漏
注意要设置一个哑巴节点,使算法具有普适性

代码

/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* removeNthFromEnd(ListNode* head, int n) {

        /*
        if(head==nullptr) return nullptr;

        // write code here

        // 倒数第n个节点 = 正数第k+1-n个,k为节点个数

        ListNode* cur = head;
        int count = 0;
        while(cur!=nullptr){
            cur = cur->next;
            count++;
        }

        ListNode* dum = new ListNode(0);
        dum->next = head;

        ListNode* ptr = dum;
        // 这样变成了删除K+2-n个指针,先找到k+2-n-1个指针
        for(int i = 1; i<=count-n;i++){
            ptr = ptr->next;
        }

        ListNode* nex = ptr->next;
        ptr->next = nex->next;
        free(nex);

        return dum->next;
        */

        // 双指针法
        ListNode* dump = new ListNode(0);
        dump->next = head;

        ListNode* slow = dump;
        ListNode* fast = dump;

        // fast指针先走n-1步
        for(int i = 1; i<=n+1; i++){
            fast = fast->next;
        }
        while(fast!=nullptr){
            fast = fast->next;
            slow = slow->next;
        }

        slow->next = slow->next->next;

        return dump->next;


    }
};
全部评论

相关推荐

04-15 09:59
门头沟学院 C++
yy_11:小公司人家没必要泄密,大公司都是本地部署了
你想吐槽公司的哪些规定
点赞 评论 收藏
分享
03-29 17:05
门头沟学院 Java
asdasdasda...:我前段时间找工作焦虑,有几天连续熬夜熬穿了,然后心脏突然不舒服,立马躺床上睡觉了,然后第二天还是不舒服,去看医生说是心率不齐,吓得我后面天天早早睡觉,调养身体,过了好几天才好过来。所以真的,工作这些东西哪有那么重要,最多钱多一点钱少一点,降低物欲。活着才是最重要的,现在想想真的后怕
如何排解工作中的焦虑
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务