zoukankan      html  css  js  c++  java
  • 链表问题----删除倒数第K个节点

    在单链表和双链表中删除倒数第K个节点

      

      分别实现两个函数,一个可以删除单链表中的倒数第K个节点,一个可以删除双链表中的倒数第k 个节点,要求时间复杂度是 O(N),空间复杂度是 O(1)。

      

      【解析】

      基本思路:

      让链表从头开始走到尾,每移动一步,就让k值减一,当k 值走到结尾时,

      如果k 值大于0,说明链表根本没有倒数第k 个节点

      如果等于0,那么头节点就是倒数第k 个节点,此时应该返回 head.next

      如果小于0,则重新从头节点开始,每移动一步,k 值增加一,当k 等于0时,移动停止,移动到的节点就是要删除节点的上一个节点

      

    package com.test;
    
    import com.test.ListNode;
    import com.test.ListNodeDouble;
    
    /**
     * Created by Demrystv.
     */
    public class DelLastKNode {
    
    
        //删除单链表中的倒数第K 个节点
        public ListNode removeLastKthNodeInSingle(ListNode head, int lastKth){
            if (head == null || lastKth < 1){
                return null;
            }
    
            ListNode cur = head;
            while (cur != null){
                lastKth--;
                cur = cur.next;
            }
            if (lastKth == 0){
                head = head.next;
            }
    
            // 可以举例子:1 2 3 4 5 的倒数第4个节点
            if (lastKth < 0){
                cur = head;
                while (++lastKth != 0){
                    cur = cur.next;
                }
                cur.next = cur.next.next;
            }
            return head;
        }
    
    
        // 删除双链表的倒数第K 个节点,原理与上面删除倒数第K个 节点的原理类似,主要是注意指针的连接
        public ListNodeDouble removeLastKthNodeInDouble(ListNodeDouble head, int lastKth){
            if (head == null || lastKth < 1){
                return null;
            }
    
            ListNodeDouble cur = head;
            while (cur != null){
                lastKth--;
                cur = cur.next;
            }
    
            if (lastKth == 0){
                head = head.next;
                head.last = null;
            }
    
            if (lastKth < 0){
                cur = head;
                while (++lastKth != 0){
                    cur = cur.next;
                }
                ListNodeDouble newNext = cur.next.next;
                cur.next = newNext;
                if (newNext != null){
                    newNext.last = cur;
                }
            }
            return head;
        }
    }
  • 相关阅读:
    javascript 事件冒泡
    Java 理论与实践: 正确使用 Volatile 变量
    Concurrency,Java 并发
    POJ2379 ACM Rank Table 模拟题
    HDU1711Number Sequence KMP
    POJ1061 青蛙的约会 扩展GCD
    HDU2523 SORT AGAIN HASH
    HDU2087剪花布条 KMP
    HDU3736 Cyclic Nacklace KMP
    HDU1709The Balance 母函数
  • 原文地址:https://www.cnblogs.com/Demrystv/p/9311288.html
Copyright © 2011-2022 走看看