一、题目描述:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路:
1、依次遍历链表,查找元素是否重复。
2、若不重复,创建一个新链表,将当前元素添加到新链表中。
3、若重复,则删除重复节点。
给定一个排序链表:表明当前链表有序,重复元素一定相邻。
三、代码描述:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
//创建一个新链表
ListNode newHead=new ListNode(-1);
ListNode newTail=newHead;
ListNode cur=head;
while(cur!=null){
//针对某个引用进行 . 操作的时候, 必须保证该引用不能是 null
if(cur.next!=null&&cur.val==cur.next.val){
//当前元素是重复元素,查找重复元素区间。
while(cur.next!=null&&cur.val==cur.next.val){
cur=cur.next;
}
//while循环结束后,cur指向重复元素中的最后一个位置。
//cur向前再走一步,跳过了整个相同元素的区间。
cur=cur.next;
}
else{
//当前元素不是重复元素,插入到新链表中
newTail.next=new ListNode(cur.val);
newTail=newTail.next;
cur=cur.next;
}
}
return newHead.next;
}
}