劍指offer-刪除鏈表中重復(fù)的結(jié)點(diǎn)

題目描述

在一個(gè)排序的鏈表中,存在重復(fù)的結(jié)點(diǎn),請(qǐng)刪除該鏈表中重復(fù)的結(jié)點(diǎn),重復(fù)的結(jié)點(diǎn)不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理后為 1->2->5

題解:

int value用來(lái)存儲(chǔ)當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)值,創(chuàng)建一個(gè)新的鏈表節(jié)點(diǎn)用于連接符合存儲(chǔ)條件的節(jié)點(diǎn);比較當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)值和當(dāng)前節(jié)點(diǎn)的值是否相等;用tip記錄狀態(tài)int tip=0,節(jié)點(diǎn)值相等:tip=1;節(jié)點(diǎn)值不等:tip=0;

  1. 當(dāng)前節(jié)點(diǎn)與下一個(gè)節(jié)點(diǎn)的值不等時(shí):
    如果tip=0,說(shuō)明上次判斷時(shí)節(jié)點(diǎn)值也不等,所以當(dāng)前節(jié)點(diǎn)與上一個(gè)節(jié)點(diǎn)的節(jié)點(diǎn)值也不相等,可以連接該節(jié)點(diǎn);
    如果tip=1,說(shuō)明上次判斷時(shí)節(jié)點(diǎn)值相等,此時(shí)我們只需要更新value,讓它等于下一個(gè)節(jié)點(diǎn)的值即可;
  2. 當(dāng)前節(jié)點(diǎn)與下一個(gè)節(jié)點(diǎn)的值相等時(shí):
    將tip狀態(tài)更改為1;
  3. 考慮邊界條件,當(dāng)前節(jié)點(diǎn)是尾節(jié)點(diǎn)時(shí):
    根據(jù)tip判斷出當(dāng)前節(jié)點(diǎn)和上一個(gè)節(jié)點(diǎn)是否相等:不等的話讓新節(jié)點(diǎn)的next連接該節(jié)點(diǎn);相等則令新節(jié)點(diǎn)的next指向NULL;

My Solution(C/C++完整實(shí)現(xiàn)):

#include <cstdio>
#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode * deleteDuplication(ListNode* pHead) {
        ListNode result(0);
        ListNode *new_head = &result;
        int value = pHead->val;
        int tip = 0;
        while (pHead) {
            if (pHead->next && pHead->next->val == value) {
                tip = 1;
            }
            else if(pHead->next && pHead->next->val != value) {
                if (tip == 0) {
                    //可以存節(jié)點(diǎn)!
                    new_head->next = pHead;
                    new_head = new_head->next;
                }
                value = pHead->next->val;
                tip = 0;
            }
            else {
                if (tip == 0) {
                    new_head->next = pHead;
                }
                else {
                    new_head->next = NULL;
                }

            }
            pHead = pHead->next;
        }
        return result.next;
    }
};

int main() {
    ListNode a(1);
    ListNode b(2);
    ListNode c(3);
    ListNode d(3);
    ListNode e(4);
    ListNode f(5);
    ListNode g(5);
    a.next = &b;
    b.next = &c;
    c.next = &d;
    d.next = &e;
    e.next = &f;
    f.next = &g;
    Solution s;
    ListNode *result = s.deleteDuplication(&a);
    while (result) {
        printf("%d->", result->val);
        result = result->next;
    }
    return 0;
}

結(jié)果:

1->2->4->
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文首發(fā)于我的個(gè)人博客:尾尾部落 題目描述 在一個(gè)排序的鏈表中,存在重復(fù)的結(jié)點(diǎn),請(qǐng)刪除該鏈表中重復(fù)的結(jié)點(diǎn),重復(fù)的結(jié)...
    繁著閱讀 381評(píng)論 0 1
  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系,并對(duì)這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算,而且確保經(jīng)過(guò)這...
    Winterfell_Z閱讀 6,573評(píng)論 0 13
  • 轉(zhuǎn)自:http://blog.csdn.net/oreo_go/article/details/52116214 ...
    YYT1992閱讀 1,267評(píng)論 0 4
  • 在程序中我們經(jīng)常需要提醒框(alert),在swift中,使用 var alertView=UIAlertView...
    iOS成長(zhǎng)指北閱讀 3,653評(píng)論 0 1
  • 我覺(jué)得我是一個(gè)擅長(zhǎng)演戲的孩子 這是我的習(xí)慣 只要感覺(jué)到危險(xiǎn) 雖然演技拙劣 甚惹我討厭 但這是排憂絕活 簡(jiǎn)單點(diǎn),說(shuō)話...
    子魚言閱讀 151評(píng)論 0 0

友情鏈接更多精彩內(nèi)容