題目描述:
刪除有序鏈表中的重複節點,返回頭節點,例如1->1->2->2->3->4,返回3->4
public class Offer18 {
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node31 = new ListNode(3);
ListNode node4 = new ListNode(4);
node1.next = node2;
node2.next = node3;
node3.next = node31;
node31.next=node4;
deleteDuplication(node1);
System.out.println(node1);
}
//循環寫法
public static ListNode deleteDuplication(ListNode pHead) {
//設置一個新頭結點,用於刪除原頭結點(如果需要的話)
ListNode first = new ListNode(-1);
//插入到原頭結點前,成爲頭結點
first.next = pHead;
//設置一指針,指向當前節點
ListNode current = pHead;
//前指針,指向前一節點
ListNode pre = first;
while (current != null && current.next != null) {
if (current.val == current.next.val) {
//記錄重複值
int val1 = current.val;
while (current != null && current.val == val1) {
//刪除當前節點
current = current.next;
//當前節點爲上一節點的下一節點,使current重新指向當前節點
pre.next = current;
}
} else {
// 不重複則current和pre向後移動
pre = current;
//這裏是移動不是刪除,因爲之前的current已經是pre節點了
current = current.next;
}
}
return first.next;
}
}
class ListNode {
//屬性定義成公開的方便調用和使用
public int val;
//公有屬性
public ListNode next;
ListNode(int val) {
this.val = val;
}
}