1 package algorithms;
2
3 /*
4 public class ListNode {
5 int val;
6 ListNode next = null;
7
8 ListNode(int val) {
9 this.val = val;
10 }
11 }
12 */
13
14 /*
15 *
16 * 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,
17 重复的结点不保留,返回链表头指针。(认真审题)
18 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
19
20 从头遍历整个链表 如果当前节点pNode的值与下一个节点相同
21 那么他们就是重复的节点 需要被删除
22 为了保证删除之后的链表仍然是相连的
23 需要把当前节点的前一个节点pPreNode保存起来
24 循环的过程中确保pPreNode始终与下一个没有重复的节点连接在一起
25
26 */
27
28 public class DeleteDuplication {
29 public ListNode deleteDuplication(ListNode pHead) {
30 ListNode pPreNode = null;
31 ListNode pNode = pHead;
32 while (pNode != null) {
33 ListNode pNext = pNode.next;
34 boolean needDelete = false;
35 if (pNext != null && pNext.val == pNode.val)
36 needDelete = true;
37 if (!needDelete) {
38 pPreNode = pNode;
39 pNode = pNode.next;
40 } else {
41 ListNode pDeleteNode = pNode;
42 int value = pDeleteNode.val;
43 while (pDeleteNode != null && pDeleteNode.val == value) {
44 pNext = pDeleteNode.next;
45 pDeleteNode = pNext;
46 }
47 if (pPreNode == null)
48 pHead = pNext;
49 else
50 pPreNode.next = pNext;
51 pNode = pNext;
52 }
53 }
54
55 return pHead;
56 }
57 }