중복 노드를 삭제 목록의 안전성을 증명하기 위해 [제공]

제목 설명

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

분석 :

이 아이디어 목록을 횡단하는 기록을 위해 두 가지 방법은 다음 중복 된 노드를 삭제

1 작성 : 비 재귀, 손가락 비스

1) 더미 헤드 노드 (P)를 추가, 취급 성

2) 다음에 마지막으로, 제 1 노드가 현재 가리 키도록 두 포인터는 처음과 마지막 이제 설정 및하는 노드의 서로 다른 값이 현재 노드 1 세대> 다음 = 마지막을 찾아 이동

/ * 
구조체 ListNode { 
    INT 발, 
    구조체 * 다음 ListNode, 
    ListNode (INT의 X) : 
        발 (X), 다음 (NULL) { 
    } 
} 
* / 
클래스 솔루션 {
 공개 : 
ListNode * deleteDuplication (ListNode * PHEAD) 
{ 
    // 가상 제 1 노드 (P)의 증가 
    * P = ListNode를 새로운 새 - (ListNode . 1 ) 
    P -> 다음 = PHEAD; 
    
    // 제 1 노드 점을 현재 노드의 현재 마지막 후진 다른 노드와 발견 값 
    제 * ListNode = P, 
    ListNode는 * = 마지막 PHEAD, 

    그동안 (= 마지막 NULL && 마지막 -> 다음 =! NULL)
    { 
        경우 (! last-> = 브로 last->하는 next-> 발)을 
        {  = 마지막; 
            지난 = last-> 다음; 
        } 다른 
        { 
            INT (X) = last-> 발;
            반면 (! last-> 다음 = NULL) 
            { 
                경우 (last-> 브로 == X) 
                { 
                    마지막 = last-> 다음; 
                } 다른 
                { 
                    휴식 ; 
                } 
            } 
            경우 (last-> 브로 == X)
                지난 = NULL; 
            첫째 -> 다음 = 마지막; 
        } 
    } 
    반환 P-> 다음; 
} 
};

같은 생각, 재귀 : 2 쓰기

* DeleteDuplication ListNode (ListNode * PHEAD) 
{ 
    IF (PHEAD == NULL || pHead-> 다음 == NULL) // 하나 개의 노드 또는 노드 0 
        복귀 PHEAD;
     IF (pHead-> 브로 == pHead- >하는 next-> 발) // 현재 노드 중복 노드이다 
    { 
        ListNode의 * 온도 = pHead-> 다음으로,
         그동안 ! (TEMP = NULL && temp-> 브로 pHead- ==> 발) //가 현재 노드와 동일한을 건너 모든 노드는, 제 1 전류 접합 노드 다른 찾을 
            TEMP = temp-를> 다음으로,
         반환 deleteDuplication (TEMP)를; // 재귀 제 노드 다른 노드로부터 현재 시작 
    } 다른 // 현재 노드는 중복 노드가 아닌 
    { 
        PHEAD-> 다음 = deleteDuplication (pHead- 다음>); //이 현재 노드를 유지, 재귀 다음 노드에서 시작 
        반환 ; PHEAD 
    } 
}

추천

출처www.cnblogs.com/yinbiao/p/11589241.html