題目描述
給定一個(gè)排序鏈表,刪除所有含有重復(fù)數(shù)字的節(jié)點(diǎn)救欧,只保留原始鏈表中 沒有重復(fù)出現(xiàn) 的數(shù)字磷杏。
相關(guān)話題:?鏈表????難度:?中等
示例 1:
輸入: 1->2->3->3->4->4->5
輸出: 1->2->5
示例 2:
輸入: 1->1->1->2->3
輸出: 2->3
思路:
- 定義一個(gè)
p
指針遍歷鏈表 - 該題重點(diǎn)是要判斷遍歷到的節(jié)點(diǎn)是否應(yīng)該刪除劫流,很簡單,判斷條件為
p.next.next != null && p.next.val == p.next.next.val
钦无,就是判斷兩個(gè)相鄰節(jié)點(diǎn)是否相等逗栽;如果不相等,也就是不需要?jiǎng)h除铃诬,p
前進(jìn)一位祭陷。 - 如果相等,則先記錄下節(jié)點(diǎn)的值
val
趣席,然后繼續(xù)遍歷下去兵志,若節(jié)點(diǎn)的值為val
,則刪除宣肚,直至遍歷到的節(jié)點(diǎn)的值不為val
想罕,如下圖。
(注意邊界問題)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
head = dummy;
ListNode p = head;
while(p.next != null){
if(p.next.next != null && p.next.val == p.next.next.val){
int val = p.next.val;
while(p.next != null && p.next.val == val){
p.next = p.next.next;
}
}else{
p = p.next;
}
}
return head.next;
}
}
7個(gè)月前的做法霉涨,不夠簡潔
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode pHead) {
if(pHead == null) return null;
ListNode dummyNode = new ListNode(0);
dummyNode.next = pHead;
pHead = dummyNode;
int val = 0;
while(pHead.next != null && pHead.next.next != null){
//System.out.println(pHead.next.val);
if(pHead.next.val != pHead.next.next.val){
val = pHead.next.next.val;
pHead = pHead.next;
}else{
while(pHead.next != null && pHead.next.val == val){
pHead.next = pHead.next.next;
}
if(pHead.next != null)
val = pHead.next.val;
}
}
return dummyNode.next;
}
}