王道數(shù)據(jù)結(jié)構(gòu) 第二章 線性表(3) 編程題上半部分

  1. 設(shè)計(jì)一個(gè)遞歸算法划提,刪除不帶頭結(jié)點(diǎn)的單鏈表L中的所有值為x的結(jié)點(diǎn)崔涂。
void delX(linkList &L, int x) {
    Node *p;
    if (L == NULL) return;
    if (L->data == x) {
        p = L;
        L = L->pNext;
        free(p);
        delX(L, x);
    }
    else delX(L->pNext, x);
}
  1. 在帶頭結(jié)點(diǎn)的單鏈表L中关顷,刪除所有值為x的結(jié)點(diǎn)糊秆,并釋放其空間,假設(shè)值為x的結(jié)點(diǎn)不唯一议双。
void delX_1(linkList &L, int x) {
    Node *p = L->pNext, *pre = L, * q;
    while (p!=nullptr){
        if (p->data == x) {
            q = p;
            p = p->pNext;
            pre->pNext = p;
            free(q);
        }
        else {
            pre = p;
            p = p->pNext;
        }
    }
}

void delX_2(linkList &L, int x) {
    Node *p = L->pNext, *r = L, *q;
    while (p != nullptr) {
        if (p->data != x) {
            r->pNext = p;
            r = p;
            p = p->pNext;
        }
        else {
            q = p;
            p = p->pNext;
            free(q);
        }
    }
    r->pNext = nullptr;
}
  1. 設(shè)L為帶頭結(jié)點(diǎn)的單鏈表扩然,編寫(xiě)算法實(shí)現(xiàn)從尾到頭反向輸出每個(gè)結(jié)點(diǎn)的值。
void reverse_traverse(linkList L,int cnt) {
    Node *p = L->pNext;
    if (p) {
        reverse_traverse(p, cnt + 1);
        if (cnt) cout << p->data << " ";
        else cout << p->data << endl;
    }
}//我?guī)Я烁袷交敵?
  1. 試編寫(xiě)在帶頭結(jié)點(diǎn)的單鏈表L中刪除一個(gè)最小值結(jié)點(diǎn)的高效算法(假設(shè)最小值結(jié)點(diǎn)是唯一的)
void deleteMin(linkList &L) {
    Node *p = L->pNext, *pre = L,*minNode = p , *minNodePre = L;
    while (p != nullptr) {
        if ( p->data < minNode->data ) {
            minNode = p;
            minNodePre = pre;
        }
        pre = p;
        p = p->pNext;
    }
    minNodePre->pNext = minNode->pNext;
    free(minNode);
}
  1. 試編寫(xiě)算法將帶頭指針的單鏈表就地逆置聋伦,輔助空間復(fù)雜度為O(1)
void reverse_1(linkList &L) {
    Node *p = L->pNext, *next;
    L->pNext = nullptr;
    while (p) {
        next = p->pNext;
        p->pNext = L->pNext;
        L->pNext = p;
        p = next;
    }
}

void reverse_2(linkList &L) {
    Node *p = L->pNext, *next = p->pNext;
    Node *pre;
    p->pNext = nullptr;
    while (next) {
        pre = p;
        p = next;
        next = next->pNext;
        p->pNext = pre;
    }
    L->pNext = p;
}
  1. 有一個(gè)帶頭結(jié)點(diǎn)的單鏈表L夫偶,設(shè)計(jì)一個(gè)算法使其元素遞增有序。
void sort_increase(linkList &L) {
    Node *p = L->pNext, *pre;
    Node *r = p->pNext;
    p->pNext = nullptr;
    p = r;
    while (p) {
        r = p->pNext;
        pre = L;
        while (pre->pNext != nullptr && pre->pNext->data < p->data)
            pre = pre->pNext;
        p->pNext = pre->pNext;
        pre->pNext = p;
        p = r;
    }
}
  1. 設(shè)在一個(gè)帶表頭結(jié)點(diǎn)的單鏈表中所有元素結(jié)點(diǎn)的數(shù)據(jù)值無(wú)序觉增,編寫(xiě)一函數(shù)兵拢,刪除表中所有介于給定的兩個(gè)值之間的元素。
void del_between_AandB(linkList &L, int a, int b) {
    Node *p = L->pNext, *pre = L;
    while (p) {
        if (p->data >= a && p->data <= b) {
            Node *temp = p;
            p = p->pNext;
            pre->pNext = p;
            free(temp);
        }
        else {
            pre = p;
            p = p->pNext;
        }
    }
}
  1. 給定兩個(gè)單鏈表逾礁,找出兩個(gè)鏈表的公共結(jié)點(diǎn)说铃。
linkList search_first_common(linkList L1, linkList L2) {
    int len1 = length(L1), len2 = length(L2);
    int sub = abs(len1 - len2);
    linkList long_list, short_list;
    if (len1 > len2) long_list = L1->pNext, short_list = L2->pNext;
    else long_list = L2->pNext, short_list = L1->pNext;
    while (sub--)  long_list = long_list->pNext;
    while (long_list) {
        if (long_list == short_list) return long_list;
        else long_list = long_list->pNext, short_list = short_list->pNext;
    }
    if (long_list == nullptr)
        return nullptr;
}
  1. 給定一個(gè)帶表頭結(jié)點(diǎn)的單鏈表,按遞增次序輸出單鏈表中各個(gè)結(jié)點(diǎn)的數(shù)據(jù)元素嘹履,并釋放結(jié)點(diǎn)所占的存儲(chǔ)空間腻扇。(不允許使用數(shù)組作為輔助空間)
void print_increase(linkList &L) {
    linkList pre, p;
    while (L->pNext) {
        pre = L;
        p = pre->pNext;
        while (p->pNext) {
            if (p->pNext->data < pre->pNext->data)
                pre = p;
            p = p->pNext;
        }
        cout << pre->pNext->data;
        linkList temp = pre->pNext;
        pre->pNext = temp->pNext;
        free(temp);
    }
    free(L);
}
  1. 將一個(gè)帶頭結(jié)點(diǎn)的單鏈表A分解為兩個(gè)帶頭結(jié)點(diǎn)的單鏈表A和B,使得A中含有原表中序號(hào)為奇數(shù)的元素砾嫉,B中含有原表中序號(hào)為偶數(shù)的元素幼苛,保持相對(duì)順序不變。
void split_list_to_a_b(linkList L, linkList a, linkList b) {
    Node *p = L;
    int i = 0;
    Node *pa = a;
    Node *pb = b;
    while (p->pNext) {
        if (i % 2 == 1) {
            pa->pNext = p->pNext;
            pa = pa->pNext;
            p = p->pNext;
            print_node(pa);
        }
        else {
            pb->pNext = p->pNext;
            pb = pb->pNext;
            p = p->pNext;
            print_node(pb);
        }
        i++;
    }
    pa->pNext = nullptr;
    pb->pNext = nullptr;
}
  1. 在一個(gè)線性遞增的有序單鏈表中焕刮,有數(shù)值相同的元素存在舶沿,設(shè)計(jì)算法去除數(shù)值相同的元素墙杯,使表中不再有重復(fù)的元素。
void uniquify_sortedList(linkList L) {
    linkList p = L->pNext, temp = p;
    while (p->pNext) {
        temp = p->pNext;
        if (temp->data == p->data) {
            p->pNext = temp->pNext;
            free(temp);
        }else p = p->pNext;
    }
}

哇題目好多括荡,寫(xiě)到暈厥8吒洹!加上鏈表實(shí)現(xiàn)快400行代碼了畸冲。嫉髓。
下次再補(bǔ)!邑闲!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岩喷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子监憎,更是在濱河造成了極大的恐慌,老刑警劉巖婶溯,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲸阔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡迄委,警方通過(guò)查閱死者的電腦和手機(jī)褐筛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)叙身,“玉大人渔扎,你說(shuō)我怎么就攤上這事⌒沤危” “怎么了晃痴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)财忽。 經(jīng)常有香客問(wèn)我倘核,道長(zhǎng),這世上最難降的妖魔是什么即彪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任紧唱,我火速辦了婚禮,結(jié)果婚禮上隶校,老公的妹妹穿的比我還像新娘漏益。我一直安慰自己,他們只是感情好深胳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布绰疤。 她就那樣靜靜地躺著,像睡著了一般舞终。 火紅的嫁衣襯著肌膚如雪峦睡。 梳的紋絲不亂的頭發(fā)上翎苫,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音榨了,去河邊找鬼煎谍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛龙屉,可吹牛的內(nèi)容都是我干的呐粘。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼转捕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼作岖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起五芝,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤痘儡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后枢步,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沉删,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年醉途,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矾瑰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隘擎,死狀恐怖殴穴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情货葬,我是刑警寧澤采幌,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站震桶,受9級(jí)特大地震影響植榕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尼夺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一尊残、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淤堵,春花似錦寝衫、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至扎阶,卻和暖如春汹胃,著一層夾襖步出監(jiān)牢的瞬間婶芭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工着饥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犀农,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓宰掉,卻偏偏與公主長(zhǎng)得像呵哨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子轨奄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容