[행사] [18-2] [중복 노드 목록을 삭제]

제목 설명

  노드가 중복 정렬 된 링크 목록에서 중복 된 노드 목록을 삭제, 노드가 반복 유지하지 않는, 헤드 포인터 목록을 반환합니다. 예를 들어,리스트 4-> 5 취급> 2-> 3-> 3-> 4 -> 1 1-> 2-> 5

아이디어 분석

  이 때문에 정렬 된 목록이 현재 노드와 다음을 결정 목록을 통과, 우리는 세 가지 포인터를 설정 이전 노드, 현재 노드와 다음 노드로, 다음 페이지, 포인트를 미리 할 수 있습니다 ,, 중복 노드를 삭제 노드는 플래그 비트가 제공되는 동일합니다 needDel:
  아무도 찾을 수없는 경우 1. 포인터가 뒤로 이동 싶었다
  2. 그렇지 않으면 true로 설정, 목록이 정렬되어 있기 때문에 당신은 (노드를 반복을 통해 다음주기 검색을 계속할 수 있습니다 )
참고 :

  1. 하나 개의 노드 목록
  2. 삭제이 첫 번째 노드의 경우이고

테스트 케이스

  1. 기능 시험 (목록의 머리, 중앙 꼬리, 아니 중복 노드에있는 중복 노드)
  2. 특별 시험 (null의 경우, 모든 노드가 반복)

자바 코드

public class Offer18_02 {

    public static void main(String[] args) {
        System.out.println("****功能测试***");
        test1();
        System.out.println("***特殊输入测试****");
        test2();
    }

    public static ListNode deleteDuplication(ListNode pHead) {
        return Solution1(pHead);
    }

    /**
     * 
     * 需要设置三个指针,pre pNode 和 next ;
     * 
     * @param pHead
     * @return
     */
    private static ListNode Solution1(ListNode pHead) {
        if (pHead == null || pHead.next == null) {// 如果链表为空或者只有一个节点
            return pHead;
        }
        ListNode pre = null;
        ListNode pNode = pHead; // 代表当前节点
        while (pNode != null) {// 从头结点开始遍历链表
            boolean needDel = false;
            ListNode pNext = pNode.next;
            if (pNext != null && pNext.val == pNode.val) {
                // 如果当前节点的下一个结点不为null 且其值和当前节点相等
                needDel = true;
            }
            if (!needDel) {// 如果没有找到重复的元素就将指针往后移动
                pre = pNode;
                pNode = pNode.next;
            } else { // 找到重复的元素
                ListNode toBeDel = pNode;
                int value = toBeDel.val;
                while (toBeDel != null && toBeDel.val == value) {
                    // 将指针移到所有重复元素的后面
                    toBeDel = toBeDel.next;
                }
                if (pre == null) {// 删除的是第一个节点
                    pHead = toBeDel;
                } else {
                    pre.next = toBeDel;
                }
                pNode = toBeDel;
            }
        }

        return pHead;
    }

    /**
     * 功能测试
     */
    private static void test1() {//
        System.out.println("有两对重复的");
        ListNode node6 = new ListNode(6, null);
        ListNode node5 = new ListNode(6, node6);
        ListNode node4 = new ListNode(3, node5);
        ListNode node3 = new ListNode(3, node4);
        ListNode node2 = new ListNode(2, node3);
        ListNode node1 = new ListNode(1, node2);
        ListNode pHead = new ListNode(-1, node1);// 头结点
        System.out.println("删除之前");
        printListNode(pHead);
        System.out.println("删除之后--->");
        deleteDuplication(pHead);
        printListNode(pHead);
    }

    /**
     * 
     */
    private static void test2() {//
        System.out.println("所有的元素都是重复的");
        ListNode node6 = new ListNode(1, null);
        ListNode node5 = new ListNode(1, node6);
        ListNode node4 = new ListNode(1, node5);
        ListNode node3 = new ListNode(1, node4);
        ListNode node2 = new ListNode(1, node3);
        ListNode node1 = new ListNode(1, node2);
        ListNode pHead = new ListNode(-1, node1);// 头结点
        System.out.println("删除之前");
        printListNode(pHead);
        System.out.println("删除之后--->");
        deleteDuplication(pHead);
        printListNode(pHead);
    }

    /**
     * 打印链表
     * 
     * @param pHead
     */
    private static void printListNode(ListNode pHead) {
        ListNode p = pHead.next;
        while (p != null) {
            System.out.print(p.val + " ");
            p = p.next;
        }
        System.out.println();
    }

}

코드 링크

안전 코드를 증명하는 행사는 -Java

추천

출처www.cnblogs.com/haoworld/p/offer182-shan-chu-lian-biao-zhong-zhong-fu-de-jie-.html