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;
        }
    };
    
    
  • 相关阅读:
    排序之快速排序
    希尔排序
    大数据的乘法
    大数据的乘法实现——C语言
    js函数纪实
    【转】js中$含义及用法
    python基础操作
    git 常用指令
    Django框架学习记录
    【转】Java 字符串拼接 五种方法的性能比较分析 从执行100次到90万次
  • 原文地址:https://www.cnblogs.com/ZigHello/p/15016826.html
Copyright © 2011-2022 走看看