给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→5, 返回1→2→5.
给出的链表为1→1→1→2→3, 返回2→3.
class ListNode {
int val;
ListNode next = null;
public ListNode(int val, ListNode next){
this.val = val;
this.next = next;
}
}
public class Linklist {
public static void main(String[] args) {
ListNode node4 = new ListNode(3, null);
ListNode node3 = new ListNode(3, node4);
ListNode node2 = new ListNode(2, node3);
ListNode node1 = new ListNode(1, node2);
ListNode head = node1;
System.out.println(print(head));
ListNode new_head = deleteDuplicates(head);
System.out.println(print(new_head));
}
public static List<Integer> print(ListNode head){
List<Integer> list = new ArrayList<>();
while(head!=null){
list.add(head.val);
head = head.next;
}
return list;
}
public static ListNode deleteDuplicates (ListNode head) {
// write code here
ListNode new_head = new ListNode(0, null);
ListNode pre = new_head;
ListNode cur = head;
int count = 0; // 用于判断是否重复,大于0表示重复
while(cur!=null && cur.next!=null){
if(cur.val==cur.next.val){
// 重复时进行标记,并删除重复的节点
count++;
cur.next=cur.next.next;
}else {
if(count>0){
// 当下一个元素与当前元素不重复时,删除当前元素
count=0;
}else {
// 当下一个元素与当前元素不重复时,并且当前元素没重复时,加入最终链表中
pre.next=cur;
pre = pre.next;
}
cur = cur.next;
}
}
// 对尾部情况进行处理
if(cur!=null && count==0){
pre.next = cur;
pre = pre.next;
}
// 链表末尾要添加空元素
pre.next=null;
return new_head.next;
}
}