題目描述
在一個排序的鏈表中,刪除重復的節(jié)點。
解題思路:
- 由于鏈表是排序的,可從頭到尾遍歷鏈表,如果當前節(jié)點A的值和下一個節(jié)點的值相同,則這個節(jié)點是可刪除的,并再次從節(jié)點A開始遍歷,把和A相同節(jié)點都刪掉。
- 需要注意的是,頭節(jié)點也可能被刪除。
代碼
ListNode deleteDuplicate(ListNode head){
if (head == null) {
return null;
}
ListNode preNode = null;
ListNode curNode = head;
ListNode newHead = head; // 保存頭節(jié)點
while (curNode != null && curNode.next != null) {
boolean needDel = false;
if (curNode.value == curNode.next.value) {
// 判斷節(jié)點是否重復
needDel = true;
}
if (needDel) {
// 刪除和當前節(jié)點值相同的所有節(jié)點
String value = curNode.value;
while (curNode!= null && curNode.value == value) {
curNode = curNode.next;
}
if (preNode != null) {
preNode.next = curNode;
} else {
preNode = curNode;
newHead = preNode;
}
} else {
if (preNode == null) {
newHead = curNode;
}
preNode = curNode;
curNode = curNode.next;
}
}
return newHead;
}