/** * 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。 * * 示例 1: * * 输入: 1->2->3->3->4->4->5 * 输出: 1->2->5 * 示例 2: * * 输入: 1->1->1->2->3 * 输出: 2->3 */
代码如下:
public ListNode deleteDuplicates(ListNode head) { if(head == null || head.next == null) return head; //虚拟头结点 ListNode dummy = new ListNode(-1); //标记结点 ListNode sign = dummy; dummy.next = head; //当前结点 ListNode cur = head; while(cur!=null){ ListNode np = cur.next; //count用来计数,表示相邻链表是否相等,相等加1, // int count = 0; while(np!=null){ if(np.val == cur.val){ np = np.next; count++; }else{ break; } } //判断第一个结点是否重复 if(count>=1 && cur == head){ sign.next = np; dummy = sign; cur = np; } //第一个结点不重复,后面结点重复 else if(count>=1){ sign.next = np; cur = np; } //当前遍历没有重复结点 else{ sign = sign.next; cur = cur.next; } } return dummy.next; }
以上的注释可能解释的不太清楚,建议读者看着代码画图,这样其实更好理解这道题,其实链表这块的题只要你画图都是很容易解出来的。