Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5
, return 1->2->5
.
Given 1->1->1->2->3
, return 2->3
.
这道题比上一道题难度大很多,首先,好多情况都要考虑
因为是要删除链表中的重复元素,所以要分好多种情况,如果整个链表的元素相同?如果头结点和第二个元素相同?如果最后两个元素相同?
这道题自己没想起来,看剑指offer上面试题57才有了大致的思路,定义一个指向head的结点可以省好多事
另外,定义了一个布尔变量,如果值相同,就代表应该删除,这里很巧妙的如果布尔值为true那么我继续指向下一个元素,否则两个指针都向前推进。
下面附上代码:
public ListNode deleteDuplicates(ListNode head) { if(head == null || head.next == null) return head; ListNode newHead = new ListNode(-1); newHead.next = head; ListNode p1 = newHead; ListNode p2 = head; while(p2!=null){ boolean dup = false; while(p2.next!=null && p2.val == p2.next.val){ dup = true; p2 = p2.next; } if(dup){ p2 = p2.next; continue; } p1.next = p2; p1 = p1.next; p2 = p2.next; } p1.next = p2; return newHead.next; }
稍后再看看剑指offer上的源码。