删除链表中重复的结点_java

 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 }

 

posted @ 2019-03-27 20:23  Practical  阅读(891)  评论(0编辑  收藏  举报