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

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

思路:



要删除的节点i,先把i的下一个节点j的内容复制到i,然后把i的指针指向节点j的下一个节点。此时再删除节点j,其效果刚好是把节点i给删除了。

上述问题还有一个问题;如果要删除的节点位于链表的尾部,那么它就没有下一个节点,怎么办?我们让然从链表的头节点开始,顺序遍历得到该节点的前序节点,并完成删除操作。

最后需要注意的是,如果链表中只有一个节点,而我们又要 链表的头节点(也是尾节点),此时我们在删除节点之后,还需要把链表的头节点设置为NULL。、

java实现:

public class ListNode {
	int val;
	ListNode next=null;
	
	ListNode(){
		
	}

	ListNode(int val){
		this.val=val;
	}
	
	ListNode(int val,ListNode next){
		this.val=val;
		this.next=next;
	}

}

public class DeleteNode {
	public static void deleteNode(ListNode head,ListNode node) {
		if(head==null||node==null) return;
		//要删除的不是尾结点
		if(head.next!=null) {
			node.val=node.next.val;
			node.next=node.next.next;
		}
		//链表只有一个结点,删除头结点
		else if(head==node) {
			head=null;
		}
		//链表有多个结点,要删除的是尾节点,从头遍历到尾
		else {
			while(head.next!=node) {
				head=head.next;
			}
			head.next=null;
		}
	}
	
	public static void main(String[] args) {
		ListNode tail=new ListNode(1,null);
		ListNode c=new ListNode(2,tail);
		ListNode b=new ListNode(3,c);
		ListNode head=new ListNode(4,b);
		deleteNode(head,c);
		while(head!=null) {
			System.out.println(head.val);
			head=head.next;
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值