剑指offer10--O(1)的时间实现单链表节点的删除

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

本题目关键点在于考虑各种情况,还有最后的节点在中间的删除方式也是比较巧妙的

package 剑指offer;
/* 给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内
 * 删除该节点*/
public class Test13 {
	public static void main(String args[]){
		ListNode head = new ListNode();
		head.value = 1;
		
		head.next = new ListNode();
		head.next.value = 2;
		
		head.next.next = new ListNode();
		head.next.next.value = 3;
		
		head = Test13.deleteNode(head, null);
		Test13.printNum(head);
	}
	
	public static class ListNode{
		int value;
		ListNode next;
		
		public void addValue(int value){
			this.value = value;
		}
	}
	
	public static ListNode deleteNode(ListNode head, ListNode toDelete){
		// 如果输入的值是空的,就返回head
		if(head == null || toDelete == null){
			return head;
		}
		
		// 如果要删除的是头结点,就返回头结点的第二个节点
		if(head == toDelete){
			return head.next;
		}
		
		if(toDelete.next == null){
			ListNode temp = head;
			while(temp != toDelete){
				temp = temp.next;
			}
			temp.next = null;
		}else{
			// 这个比较巧妙,也就是当要删除的是一个中间节点时,应该这样做
			toDelete.value = toDelete.next.value;
			toDelete.next = toDelete.next.next;
		}
		return head;
	}
	
	// 根据头结点来一次输出链表中的元素
	public static void printNum(ListNode head){
		while(head != null){
			System.out.println(head.value);
			head = head.next;
		}
		System.out.println("null");
	}
}

尽所有可能考虑各种情况,你永远不知道输入的是什么

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值