在O(1)时间删除链表的节点

19 篇文章 0 订阅
19 篇文章 0 订阅

剑指offerNo.13,比较直观的是O(n)的算法,代码如下

package com.zjy.sword2offer;

class ListNode{
	int val;
	ListNode next;
}

public class DeleteNode {
	public ListNode deleteNode(ListNode head, ListNode key){
		if(head==null||key==null)
			return null;
		
		if(head.next==null)
			head = null;
		
		ListNode previous = null;
		ListNode current = head;
		while(current.val!=key.val && current.next!=null)
		{
			previous = current;
			current = current.next;
		}
		
		if(previous==null)
		{
			head = current.next;
			current.next = null;
		}
		else
		{
			if(current.next==null)
			{
				previous.next = null;
			}
			else
			{
				previous.next = current.next;
				current.next = null;
			}
		}
		return head;
	}
}

要实现O(1)复杂度,即不需要知道要删除节点的前一个节点,那么可以把要删除节点的后一个节点复制到要删除的节点上,再删除该节点

public void deleteNode2(ListNode head, ListNode delete){
		if(head==null||delete==null)
			return;
		
		if(head.equals(delete))
		{
			head = delete = null;
		}
		else if(delete.next!=null)
		{
			delete.val = delete.next.val;
			delete.next = delete.next.next;
			delete.next.next = null;
		}
		else
		{
			ListNode tmp = head;
			while(tmp.next!=delete)
			{
				tmp = tmp.next;
			}
			tmp.next = null;
			delete = null;
		}
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值