剑指offer 面试题18 删除链表的节点

删除链表的节点

题目1. 在O(1)时间内删除链表节点

给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。链表节点与函数的定义如下:
public static class ListNode{
public int data;
public ListNode next;
public ListNode(int data, ListNode next){
this.data=data;
this.next=next;
}
}

思路

将要删除节点的next节点直接复制到该节点上。删除原先的next节点

代码

public void deleteNode(ListNode head, ListNode, node){
		if(node.next==null){
			while(head.next!=node){
				head=head.next;
			}
			head.next=null;
	}
	else if(head==node){
		head=null;
	}
	else{
		node.data=node.next.data;
		node.next=node.next.next;
		
	}

}

题目2 删除链表中重复的节点

在一个排序的链表中,如何删除重复的节点?

思路

我们需要设置一个preNode来记录当前节点的前一个节点。如果当前节点的值与下一个节点的值相等的话,就把preNode和下一个节点的下一个节点所连接起来。

代码

public void deleteDuplication(ListNode pHead){
	if(pHead == null || pHead.next ==null)
	{
		return;
	}
	ListNode preNode=null;
	ListNode curNode=pHead;
	while(curNode!=null){
		boolean needDelete = false;
		if(curNode.next!=null && curNode.val==curNode.next.val)
			needDelete = true;
		if(!needDelete){
			preNode=curNode;
			curNode= cureNode.next;
		}
		else{
			int dupValue = curNode.val;
			ListNode toBeDel= curNode;
			while(teBeDel!=null && tobeDel.val == dupvalue){
				toBeDel=toBeDel.next;
			}
			if(preNode==null){
				pHead = toBeDel;
			}else{
				preNode.next=toBelDel;
			}
			curNode = toBeDel;
		}
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值