(java)在一个有序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。

在一个有序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 

例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

有两种方法:创建一个虚结点和不创建虚结点

方法1:创建一个虚结点

1.创建一个假结点fake,让它的下一个结点为head,设Node prev=fake;设p1=head,p2=head.next;

2.当p2不为空时,有两种情况

1)p1.value!=p2.value,让三个值分别往后走

2)当p2!=null&&p1.value==p2.value,让p2=p2.next,直到两个值不相等,跳出循环,直接让 prev.next=p2,p1=p2,直接跳过相等的值,最后p2=p2.next

3.最后返回fake.next

方法2:不创建虚结点

和方法1相似:不同的是,设一个prev=null,在遇到两个相等的值时,要看prev是否为空,为空的话直接让p2=head;否则的话,prev.next=p2;最后直接返回头结点

 //方法1:创建一个虚结点	
	public static Node deleteDuplication(Node head){
		if(head==null){
			return null;
		}
		Node fake=new Node(1);
		fake.next=head;
		Node prev=fake;
		Node p1=head;
		Node p2=head.next;
		while(p2!=null){
			if(p1.value!=p2.value){
				prev=p1;
				p1=p2;
				p2=p2.next;
			}
			else{
				while(p2!=null&&p1.value==p2.value){
					p2=p2.next;
				}
				prev.next=p2;
				p1=p2;
				if(p2!=null){
					p2=p2.next;
				}
			}
		}
		return fake.next;
	}
	//方法2:不创建虚结点
	public static Node deleteDuplication1(Node head){
		if(head==null){
			return null;
		}
		Node prev=null;
		Node p1=head;
		Node p2=head.next;
		while(p2!=null){
			if(p1.value!=p2.value){
				prev=p1;
				p1=p2;
				p2=p2.next;
			}
			else{
				while(p2!=null&&p1.value==p2.value){
					p2=p2.next;
				}
				if(prev==null){
					head=p2;
				}
				else{
					prev.next=p2;
				}
				p1=p2;
				if(p2!=null){
					p2=p2.next;
				}
			}
		}
		return head;
	}

发布了62 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43669007/article/details/93208306