描述:
给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。
样例
给出 1->2->3->3->4->4->5->null,返回 1->2->5->null
给出 1->1->1->2->3->null,返回 2->3->null
思路
- 由于链表的开头可能有重复项,而最终还需要返回链表的头指针,所以需要定义新链表,设置一个初始节点。
- 由于需要比较前后值,判定重复,所以需要一个前驱指针,采用慢指针的方式实现,慢指针始终比现节点慢一步
-遍历整个链表,当前的值不等于前驱节点的值和后继节点的值,则将该值加入新链表中。
public static ListNode deleteDuplicates(ListNode head) {
ListNode dump = head;
ListNode newHead = new ListNode(0);
ListNode result = newHead;
if (head == null || head.next == null) {
return head;
}
while (head != null && head.next != null) {
if (head.val != head.next.val && (head == dump || head.val != dump.val)) {
newHead.next = new ListNode(head.val);
newHead = newHead.next;
}
if (dump != head) {
dump = dump.next;
}
head = head.next;
}
if (head.next==null&&head.val!=dump.val){
newHead.next=new ListNode(head.val);
}
return result.next;
}