题目:
删除给出链表中的重复元素(链表元素从小到大有序),删除所有重复的元素。
示例:
给出的链表为:1->1->2,返回:2 。
给出的链表为:1→1→2→3→3,返回:2。
解题:
主要思想就是三个指针:
current:遍历的指针
pre:不同val的前置节点
subHead: 重复元素构成的子链表的头节点
public static final class ListNode{
public int val;
public ListNode next;
public String print() {
return val+(next!=null?"->"+next.print():"");
}
}
public static ListNode clearDuplicatedNode(ListNode head){
ListNode current=head;
ListNode subHead=head;
ListNode pre=null;
while(current!=null){
int c=1;
current=current.next;
while(current!=null&¤t.val==subHead.val){
current=current.next;
c++;
}
if (c>1) {
if(subHead==head){
head=current;
}else{
pre.next=current;
}
}else {
pre=subHead;
}
subHead=current;
}
return head;
}
测试代码:
输入用例:
2-2-2-2,1-2-2,2-1-1,null,1-2-2-3,1-2-2-3-4-4-5, 1
public static void testClearDuplicatedNode() {
ListNode head = new ListNode();
ListNode n2 = new ListNode();
ListNode n3 = new ListNode();
ListNode n4 = new ListNode();
head.val=2;
n2.val=2;
n3.val=2;
n4.val=2;
head.next=n2;
n2.next=n3;
n3.next=n4;
ListNode listNode = clearDuplicatedNode(head);
System.out.println("clearDuplicatedNode(head) = " + (listNode==null?"":listNode.print()));
}