题目:
在一个排序的链表中,存在重复的结点,删除重复的且不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路:一般都是设置一个先前的结点,因为第一个也可能是重复的。
public class Solution{ public static void main(String[] args) { int[] arr = new int[]{1, 2, 3, 3, 3, 4, 4, 4, 4, 5}; ListNode head = Insert(arr); show(head); show(deleteDuplication1(head)); } //常用新建3个节点来判断 public static ListNode deleteDuplication(ListNode pHead) { if (pHead == null || pHead.next == null) { return pHead; } //建先前结点,因为头结点可能是重复的。 ListNode first = new ListNode(-1), pre; first.next = pHead; pre = first; while (pHead != null && pHead.next != null) { if (pHead.val == pHead.next.val) { int val = pHead.val; while (pHead != null && pHead.val == val) { pHead = pHead.next; } pre.next = pHead; } else { pre = pHead; pHead = pHead.next; } } return first.next; } //容器类,简化代码 public static ListNode deleteDuplication1(ListNode pHead) { LinkedList<ListNode> result = new LinkedList<ListNode>(); result.addLast(new ListNode(-1)); boolean isRepeated = false; while (pHead != null) { // 如果等于就不会加元素了 if (result.getLast().val == pHead.val) { isRepeated = true; } else { if (isRepeated) { result.removeLast(); isRepeated = false; } result.addLast(pHead); } pHead = pHead.next; } if (isRepeated) result.removeLast(); if (result.size() == 1) return null; //生成一个链表 for (int i = 0; i < result.size() - 1; i++) { result.get(i).next = result.get(i + 1); } result.get(result.size() - 1).next = null; return result.get(0).next; } //删除链表重复的结点,递归来算 public static ListNode deleteDuplication2(ListNode pHead) { if (pHead == null || pHead.next == null) { return pHead; } if (pHead.val == pHead.next.val) { // 当前结点是重复结点 ListNode pNode = pHead.next; while (pNode != null && pNode.val == pHead.val) { //跳过值与当前结点相同的结点,找打第一个与当前结点不同的结点 pNode = pNode.next; } // 从第一个与当前结点不同的结点开始递归 return deleteDuplication2(pNode); } else {//当前不是重复结点 //保留当前结点,从下一个结点开始递归 pHead.next = deleteDuplication2(pHead.next); return pHead; } } static class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } private static ListNode Insert(int[] array) { if (array == null) return null; ListNode head = new ListNode(array[0]); ListNode cur = head; for (int i = 1; i < array.length; i++) { ListNode node = new ListNode(array[i]); cur.next = node; cur = node; } return head; } public static void show(ListNode head) { if (head == null) return; ListNode cur = head; while (cur.next != null) { System.out.print(cur.val + " "); cur = cur.next; } System.out.println(cur.val); } }
本题注意点:
- 不仅仅要对,还要做快,用容易的方法
- 要想到用容器去便捷的处理
- 递归的思想用的不6
- 如果要留一个重复的值呢?