16、在O1时间删除链表的节点——剑指offer

在O1时间删除链表节点

问题描述:给定单向链表的头指针和一个节点指针, 定义一个函数在O(1)时间删除该节点。


    首先本题只是说删除节点的操作是O1的,实际上查找是需要On的,这个要注意一下

    本方法思想:给定当前节点的话 我们是不知道上一个节点的,所以普通方法必须遍历才能找到上一个节点,所以可以这样做:将要要删除的节点的下一个节点的值赋给要删除的节点,删除下一个节点即可,注意判断边界条件,具体注释见代码。


持续更新...

代码附下

Java实现:

package 在O1时间删除链表节点;
/**
 * 给定单向链表的头指针和一个节点指针, 定义一个函数在O(1)时间删除该节点
 * 
 * @author user 给定当前节点的话 我们是不知道上一个节点的 所以普通方法必须遍历才能找到上一个节点,所以可以这样做:
 *         将要要删除的节点的下一个节点的值赋给要删除的节点 删除下一个节点即可 注意判断边界条件
 */

class ListNode {
    int val;
    ListNode next = null;
    public ListNode(int val) {        
        this.val = val;
    }
}
public class Test {
    public static void main(String[] args) {
        ListNode n1 = new ListNode(1);
        ListNode n2 = new ListNode(2);
        ListNode n3 = new ListNode(3);
        ListNode n4 = new ListNode(4);
        n1.next = n2;
        n2.next = n3;
        n3.next = n4;
        Test test = new Test();
        ListNode head = n1;
        test.delNode(head, n1);
        while (head != null) {
            System.out.println(head.val);
            head = head.next;
        }
    }
    public void delNode(ListNode head, ListNode delNode) {
        if (head == null || delNode == null) {
            return;
        }
        if (head == delNode) {// 头节点就是要删除的节点,直接将头结点置空
            head = null;
        } else if (delNode.next == null) {// 如果要删除的是尾节点,需要遍历找到上一个节点
            ListNode node = head;
            while (node.next.next != null) {// 找到尾节点的上一个节点
                node = node.next;
            }
            node.next = null;// 将上一个节点的下一个节点置空,成为新的尾节点
        } else {// 常规情况下(既不是尾节点,也不是头节点)
            delNode.val = delNode.next.val;// 将要删除节点的下一个节点的内容拷贝
            delNode.next = delNode.next.next;// 删除下一个节点即可
        }
    }
}

持续更新...欢迎赞赏!

https://blog.csdn.net/ustcer_93lk/article/details/80372693

如果有问题,欢迎大家留言,有更好的方法也期待大家告知。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值