剑指offer-面试题 13:在 O( 1)时间删除链表结点

面试题 13:在 O( 1)时间删除链表结点

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

思路

这道题的考点是单链表的单向性。想要删除给定的结点node,其前驱结点为pNode,后继结点为nNode。正常思路是:将pNode的next值由node改为nNode(也就是node.next)。然后node对象赋值为空。用代码表示:

//初始信息
pNode.next = nNode;
node = null;

这是删除node结点的一般思路,但是在这道题中我们不知道node的前驱结点pNode,如果想要得到,只能通过遍历寻找得到pNode,和题目要求O(1)时间复杂度不符合,但是node的后继结点nNode是可以在O(1)时间复杂度内找到的。所以我们的思路是,放弃寻找pNode,转而将nNode的值存储到node结点内,然后删除nNode结点;这个办法等价于直接删除node结点。
图片表示:


O(1)时间删除链表结点

代码

package swordOffer;

/**
 * 面试题 13:在 O( 1)时间删除链表结点
 * 题目:给定单向链表的头指针和一个结点指针,定义一个函数在 O(1)时间删除该结点。
 * 
 * @author Stephen Huge
 *
 */
public class Ex13DelNodeInO_1 {
    public static void main(String[] args) throws Exception {
        ListNode d = new ListNode(4);
        ListNode c = new ListNode(3, d);
        ListNode b = new ListNode(2, c);
        ListNode a = new ListNode(1, b);
        ListNode head = a;
        Ex13DelNodeInO_1 dnio = new Ex13DelNodeInO_1();
        int data = dnio.delNodeInO_1(head, d);
        System.out.println(data);
    }
    public int delNodeInO_1(ListNode head, ListNode delNode) throws Exception {
        if(head == null || delNode == null) {
            throw new Exception("输入有误,删除失败");
        }
        if(delNode == head) {   //删除头指针
            head = delNode.next;
            int hTemp = delNode.data;
            delNode = null;
            return hTemp;
        }
        if(delNode.next == null) {  //删除尾指针
            int tTemp = delNode.data;
            delNode = null;
            return tTemp;
        }
        int mTemp = delNode.data;  
        delNode.data = delNode.next.data;
        delNode.next = delNode.next.next;       
        return mTemp;
    }
//  public class ListNode {
//      public int data;
//      public ListNode next;
//      
//      public ListNode() {     
//      }
//      public ListNode(int data) {
//          this.data = data;
//      }
//      public ListNode(int data, ListNode next) {
//          this.data = data;
//          this.next = next;
//      }       
//  }
}

代码逻辑也没不太难,在考虑了链表为null以及删除头结点和尾结点的特殊情况后,其它情况均按照上面思路处理。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值