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 }