【LeetCode 力扣 82】删除排序链表中的重复元素Ⅱ, 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

写在前面

本题与下面这道题目极其相似,读者可对比阅读,加深印象
题目博客连接

学习目标:

目标:熟练运用Java所学知识


学习内容:

本文内容:使用Java实现:删除排序链表中的重复元素Ⅱ


题目描述:

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:

输入: 1->1->1->2->3
输出: 2->3

解题思路

  • 首先创建新的链表(带傀儡),用于存放返回结果
ListNode newHead=new ListNode(0);//创建带傀儡的新链表
ListNode newTail=newHead;//记录链表的尾结点
  • 通过循环,逐个的判断当前结点的val是否与下一个结点的相同
while(cur!=null){
    
    
    //判断当前结点与下一个结点是否相同
    if(cur.next!=null&&cur.val==cur.next.val){
    
    
        //当下一个结点与当前结点相同时,跳过当前结点,直到下一个节点与当前结点不相同
        while(cur!=null&&cur.next!=null&&cur.val==cur.next.val){
    
    
            cur=cur.next;
        }
    }else{
    
    
        //将只出现一次的结点放入新链表
        newTail.next=new ListNode(cur.val);
        newTail=newTail.next;
    }
    cur=cur.next;//因为这个题目要求不保留重复元素,所以需要加上这条语句
}

实现代码

public static ListNode deleteDuplicates(ListNode head) {
    
    
    ListNode cur=head;
	ListNode newHead=new ListNode(0);//创建带傀儡的新链表
	ListNode newTail=newHead;//记录链表的尾结点
	while(cur!=null){
    
    
	    //判断当前结点与下一个结点是否相同
	    if(cur.next!=null&&cur.val==cur.next.val){
    
    
	      //当下一个结点与当前结点相同时,跳过当前结点,直到下一个节点与当前结点不相同
	        while(cur!=null&&cur.next!=null&&cur.val==cur.next.val){
    
    
	            cur=cur.next;
	        }
	         cur=cur.next;//因为这个题目要求不保留重复元素,所以需要加上这条语句
	    }else{
    
    
	        //将只出现一次的结点放入新链表
	        newTail.next=new ListNode(cur.val);
	        newTail=newTail.next;
	         cur=cur.next;
	    }
	   
	}
	return newHead.next;//返回新链表,因为带傀儡,所以从第二个节点返回
}

猜你喜欢

转载自blog.csdn.net/zhangxxin/article/details/114583808