面试题11 :O(1)删除单链表节点

题目:

写一个函数delectNode(Node header,Node delectNode),在O(1)的时间删除该节点。

输入:

输入一个头插法的单链表。从头到尾是321,要删除的节点是链表头

输出:

21

解题思路:

目前想到有两种,第一种效率较高,我们可以获得要删除的节点的下一个节点,我们只要把下一个节点复制给当前节点就可以了。但是还需要考虑几个问题,要删除的节点是否为空,要删除的节点是否为头结点或者是尾节点,这些我们都需要分别去考虑。第二种就是从头结点遍历,找到要删除的节点,然后删除,这样做的缺点是跟题目不符,时间复杂度为0(n).

java代码实现:

	public static void main(String[] args) {
		Linked linker=new Linked();
		linker.insertFirst(new Node(1));
		linker.insertFirst(new Node(2));
			Node node3=new Node(3);
			linker.insertFirst(node3);
			linker.display(linker.header);
			delectNode(linker.header, node3);
			System.out.println();
			linker.display(linker.header);

	}
	
	
	public static void delectNode(Node header,Node node){
		if(header==null && node==null){
			return;
		}
		if(node.next!=null){
			
			node.data=node.next.data;
			node.next=node.next.next;
			
		}
		else if(node==header){
			header=null;
			} else{
			Node headers=header;
			while(headers.next!=node){
				headers=headers.next;
			}
			headers.next=null;
		}
		
	}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值