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;
        }
    };
    
    
  • 相关阅读:
    二叉树基本操作(二)
    二叉树基本操作(一)
    数组的方式实现--栈 数制转换
    数据的插入与删除
    链表 创建 插入 删除 查找 合并
    ACM3 求最值
    ACM2 斐波那契数列
    ACM_1 大数求和
    简单二维码生成及解码代码:
    ORM中去除反射,添加Expression
  • 原文地址:https://www.cnblogs.com/ZigHello/p/15016826.html
Copyright © 2011-2022 走看看