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
.
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5处理后为 1->2->5.leetcode101
分析:
首先判断链表是否为空。
1.定义一个新的节点dump,使其指向pHead,最后返回dump.next即可
2.使得dump到tail结点之间为目前已经确定的结果
3.q为在剩下的链表的头结点,next为在剩下的链表中找到的第一个符合条件的节点。
循环2,3直到q为空。
/**
* 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
* 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5.
* 首先判断链表是否为空。
* 1.定义一个新的节点dump,使其指向pHead,最后返回dump.next即可
* 2.使得dump到tail结点之间为目前已经确定的结果
* 3.q为在剩下的链表的头结点,next为在剩下的链表中找到的第一个符合条件的节点
* 循环2,3知道q为空。
*/
public ListNode deleteDuplicates(ListNode pHead){
if(pHead == null || pHead.next==null){
return pHead;
}
ListNode dump = new ListNode(0);
dump.next = pHead;
ListNode tail = dump;
ListNode q = pHead;
ListNode next = pHead;
/*遍历链表*/
while(q!=null){
next = q;
next = next.next;
boolean needDelete = false;//表示某个节点是否需要被删除
while(next != null && next.val == q.val){
needDelete= true;//进到这个循环说明该节点有重复的
next = next.next;
}
if(!needDelete){//如果这个节点不需要删除,则把它加到之前选中链表的末尾。
tail.next = q;
tail = tail.next;
}
q = next;
}
tail.next = null;
return dump.next;
}