zoukankan      html  css  js  c++  java
  • 删除链表的倒数第N个节点

    题目链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
    题目描述:

    题解:
    方法1:先遍历链表长度,再查找倒数第n个节点位置。时间复杂度O(L)

    
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
            
            ListNode* dummy = new ListNode();
            dummy->next = head;
            ListNode* p = dummy;
            int length = 0;
            while(p->next != nullptr)
            {
                p = p->next;
                length++;
            }
            p = dummy;
            int k = length - n;
            while(k != 0)
            {
                p = p->next;
                k--;
            }
            p->next = p->next->next;
            return dummy->next;
        }
    };
    
    

    方法2:双指针法,第一个指针比第二个指针先n个节点遍历,当第一个指针位于链表尾时,第二个指针正好位于倒数第n个节点处。为了删除方便,第二个节点从哑节点开始遍历,第一个节点从头节点开始遍历。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
            ListNode* dummy = new ListNode();
            dummy->next = head;
            ListNode* first = head;
            ListNode* second = dummy;
            for(int i = 0; i < n; i++)
            {
                first = first->next;
            }
            while(first != nullptr)
            {
                first = first->next;
                second = second->next;
            }
            second->next = second->next->next;
            return dummy->next;
        }
    };
    
    
  • 相关阅读:
    Wayland中的跨进程过程调用浅析
    设计模式总结
    C语言---整型字符串转换
    抽象工厂模式
    SVNclient安装与使用
    [置顶] MyEclipse下安装插件方法(properties文件编辑器Propedit为例)
    脑筋急转弯的歧义性
    脑筋急转弯的歧义性
    从和式积分到定积分
    从和式积分到定积分
  • 原文地址:https://www.cnblogs.com/ZigHello/p/15016826.html
Copyright © 2011-2022 走看看