剑指Offer+第13题+在O(1)时间删除链表节点+java

代码:

//前提:假设要删除的节点存在于链表中
//删除i节点,先把i的下一个节点j的内容复制到i,然后把节点i的指针指向节点j的下一个节点

public class Offer13 {
	
	static class ListNode{
		int val;
		ListNode next;
		ListNode(int val){
			this.val = val;
		}
	}
	
	public ListNode delete(ListNode headNode, ListNode ToBeDeleteNode){
		// 1.如果链表为空,或者要删除的节点为空,返回
		if(headNode == null || ToBeDeleteNode == null)
			return null;
		
		//要删除的节点不是尾节点
		if(ToBeDeleteNode.next != null){//开始时我这里把ToBeDeleteNode.next的next忘了,结果出现空指针异常
			ListNode tempNode = ToBeDeleteNode.next;// 要建一个临时节点保存toBeDeleted的next节点
			ToBeDeleteNode.val = tempNode.val;
			ToBeDeleteNode.next = tempNode.next;
			
			tempNode = null;
		}else if(headNode == ToBeDeleteNode){  //链表只有一个节点,删除头节点(也是尾节点)
			ToBeDeleteNode = null;
			headNode = null;
		}else{                         //链表中有多个节点,删除尾节点
			ListNode tempNode = headNode;
			while(tempNode.next != ToBeDeleteNode)
				tempNode = tempNode.next;
			
			tempNode.next = null;
			ToBeDeleteNode = null;
		}
		return headNode;
	}
	
	public void print(ListNode headNode){
		if(headNode == null)
			System.out.println("List is null");
		while(headNode != null){
			System.out.print(headNode.val+", ");
			headNode = headNode.next;
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		Offer13 of13 = new Offer13();
		ListNode node1 = new ListNode(1);
		ListNode node2 = new ListNode(2);
		ListNode node3 = new ListNode(3);
		ListNode node4 = new ListNode(4);
		ListNode node5 = new ListNode(5);
		
		node1.next = node2;
		node2.next = node3;
		node3.next = node4;
		node4.next = node5;
		node5.next = null;
		//测试用例
		//1,功能测试,
		System.out.println("链表中有多个结点,删除头结点:");
		of13.print(of13.delete(node1, node1));
		
		System.out.println("链表中有多个结点,删除中间的一个结点:");
		of13.print(of13.delete(node1, node3));
		
		System.out.println("链表中有多个结点,删除尾结点:");
		of13.print(of13.delete(node1, node5));
		
		System.out.println("链表中只有一个节点,删除结点:");
		of13.print(of13.delete(node5, node5));
		
		//2,特殊输入测试,(指向链表头节点指针为NULL指针)
		System.out.println("指向链表头节点指针为NULL指针:");
		of13.print(of13.delete(null, node5));
		//指向要删除的节点为NULL指针
		System.out.println("指向要删除的节点为NULL指针:");
		of13.print(of13.delete(node1, null));
	}
}

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值