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

【题目】
分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。
【要求】
如果链表长度为N,时间复杂度达到(O(N)),额外控件复杂度达到O(1);

单链表

package com.angel.num2;
class Node{
    int value;
    Node next;
    public Node(int value){
        this.value = value;
    }
}
public class DelNode {
    public Node removeLastKthNode(Node head,int lastKth){
        if (head == null || lastKth < 1)
            return head;
        Node cur = head;
        while (cur != null){
            lastKth--;
            cur = cur.next;
        }
        if (lastKth == 0)
            head=head.next;
        if (lastKth < 0){
            cur = head;
            while(++lastKth != 0)
                cur = cur.next;
            cur.next = cur.next.next;
        }
        return head;
    }
}

双链表

package com.angel.num2;
class DoubleNode{
    int value;
    DoubleNode last;
    DoubleNode next;
    public DoubleNode(int value){
        this.value = value;
    }
}
public class DoubleDel {
    public DoubleNode removeLastKthNode(DoubleNode head, int lastKth){
        if (head == null || lastKth < 1)
            return head;
        DoubleNode cur = head;
        while (cur != null){
            lastKth--;
            cur = cur.next;
        }
        if (lastKth == 0){
            head = head.next;
            head.last=null;
        }
        if (lastKth < 0){
            while (++lastKth != 0)
                cur = cur.next;
            DoubleNode newNext = cur.next.next;
            cur.next = newNext;
            if (newNext != null)
                newNext.last = cur;
        }
        return head;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值