删除链表中重复的节点(Java实现)

本题为剑指offer面试题58

牛客网测试地址:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef


[编程题]删除链表中重复的结点
  • 热度指数:63742  时间限制:1秒  空间限制:32768K
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

Java代码:

package go.jacob.day607;

import go.jacob.day609.Demo5.ListNode;

public class Demo2 {
	// 递归实现
	public ListNode deleteDuplication_1(ListNode pHead) {
		// 递归停止条件
		if (pHead == null || pHead.next == null)
			return pHead;
		ListNode current = pHead.next;
		// 如果pHead是重复元素
		if (pHead.val == current.val) {
			current = current.next;
			while (current != null && current.val == pHead.val)
				current = current.next;
			pHead = current;
			return deleteDuplication_1(current);
		} else {
			// pHead不是重复元素
			pHead.next = deleteDuplication_1(current);
			return pHead;
		}
	}
	//方法二:循环实现
	public ListNode deleteDuplication_2(ListNode pHead) {
		if (pHead == null || pHead.next == null)
			return pHead;
		ListNode preNode = null;
		ListNode node = pHead;
		ListNode postNode = null;
		boolean needDel = false;

		while (node != null) {
			// 如果node不是最后一个节点
			if (node.next != null) {
				postNode = node.next;
				//postNode为null或者val与node.val不同的第一个节点
				while (postNode != null && postNode.val == node.val) {
					postNode = postNode.next;
					needDel = true;
				}
			} else
				//到链表结尾
				postNode = null;
			// 如果node和postNode不同,即不需要进行删除操作
			if (!needDel) {
				//如果第一个元素为空
				if (preNode == null) {
					preNode = node;
					pHead = preNode;
				} else {
					preNode.next = node;
					preNode = node;
				}
				node = postNode;
			} else {
				node = postNode;
				needDel = false;
				if (postNode == null && preNode != null)
					preNode.next = null;
			}
		}
		return preNode == null ? null : pHead;
	}
	
	
	//方法三:循环实现:剑指offer解法
	public ListNode deleteDuplication_3(ListNode pHead) {
		if(pHead==null||pHead.next==null)
			return pHead;
		ListNode pPreNode=null;
		ListNode pNode=pHead;
		while(pNode!=null){
			ListNode pNext=pNode.next;
			boolean needDelete=false;
			if(pNext!=null&&pNext.val==pNode.val)
				needDelete=true;
			if(!needDelete){
				pPreNode=pNode;
				pNode=pNode.next;
			}else{
				int value=pNode.val;
				ListNode pToBeDel=pNode;
				while(pToBeDel!=null&&pToBeDel.val==value){
					pNext=pToBeDel.next;
					pToBeDel=pNext;
				}
				if(pPreNode==null)
					pHead=pNext;
				else
					pPreNode.next=pNext;
				pNode=pNext;
			}
		}
		return pHead;
	}
	


	class ListNode {
		int val;
		ListNode next = null;

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值