1. 程式人生 > >程式設計練習:連結串列習題(上)

程式設計練習:連結串列習題(上)


(1)題目:輸入兩個連結串列,找出它們的第一個公共節點。

思路:
1)計算出連結串列1的長度;
2)計算出連結串列2的長度;
3)計算出連結串列1和連結串列2的長度差dif;
4)長連結串列先走dif步,然後兩條連結串列一起走,直到兩個連結串列的節點第一次相等為止,此時指標位置即為所求。

程式碼實現:

class Solution {
public:
   ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        ListNode *p1=pHead1;
        ListNode *p2=pHead2;
        int
len1=0,len2=0,dif=0; while(p1!=NULL){ p1=p1->next; len1++; } while(p2!=NULL){ p2=p2->next; len2++; } if(len1>len2){ dif=len1-len2; p1=pHead1; p2=pHead2; } else
{ dif=len2-len1; p1=pHead2; p2=pHead1; } for(int i=0;i<dif;i++){ p1=p1->next; } while(p1!=NULL && p2!=NULL){ if(p1==p2) break; p1=p1->next; p2=p2->next
; } return p1; } };


(2)題目:刪除連結串列中重複的節點

程式碼實現:

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {

       if (pHead==NULL)
            return NULL;
        if (pHead!=NULL && pHead->next==NULL)
            return pHead;

        ListNode* current;

        if ( pHead->next->val==pHead->val){
            current=pHead->next->next;
            while (current != NULL && current->val==pHead->val)
                current=current->next;
            return deleteDuplication(current);                     
        }   
        else {
            current=pHead->next;
            pHead->next=deleteDuplication(current);
            return pHead;
        }    
    }
};


(3)題目:sort-list:Sort a linked list in O(n log n) time using constant space complexity.

思路:
(1)快慢指標法將連結串列從中間分為了l1,l2兩部分
(2)左右兩部分連結串列分別遞迴進行排序
(3)合併兩個子連結串列

程式碼實現:

class Solution {
public:
    ListNode *sortList(ListNode *head) {
        if(head == NULL || head->next == NULL)
            return head;
        ListNode* p = head;
        ListNode* q = head->next;
        while(q && q->next)
        {
            p = p->next;
            q = q->next->next;
        }

        ListNode* l1 = sortList(p->next);
        p->next = NULL;
        ListNode* l2 = sortList(head);
        return Merge(l1,l2);
    }
        ListNode* Merge(ListNode* l1,ListNode* l2)
        {
            ListNode L(0);
            ListNode* p = &L;
            while(l1&&l2)
            {
                if(l1->val < l2->val)
                {
                    p->next = l1;
                    l1=l1->next;
                }
                else
                {
                    p->next = l2;
                    l2=l2->next;
                }
                p = p -> next;
            }
            if(l1 != NULL)
                p->next = l1;
            if(l2 != NULL)
                p->next = l2;
            return L.next;
        }
};


(4)題目:Given a singly linked list L: L 0→L 1→…→L n-1→L n,
reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→…
You must do this in-place without altering the nodes’ values.
For example,
Given{1,2,3,4}, reorder it to{1,4,2,3}.

思路:
(1)快慢指標法找到中間節點
(2)對連結串列後半部分進行逆序
(3)合併前半部分和逆序後的後半部分

程式碼實現:

class Solution {
public:
    void reorderList(ListNode *head) {
        if(head == NULL || head->next == NULL || head->next->next == NULL)
            return;

        //快慢指標找中點
        ListNode* fast = head;
        ListNode* low = head;
        while(fast->next != NULL && fast->next->next != NULL)
        {
            fast = fast->next->next;
            low = low->next;
        }

        //對low後面的部分逆序
        fast = low->next;
        low->next = NULL;
        while(fast != NULL){
            ListNode* temp = fast->next;
            fast->next = low->next;
            low->next = fast;
            fast = temp;
        }

        //合併low前面和後面兩部分
        ListNode* p = head;
        ListNode* q = low->next;
        while(p != NULL && q != NULL){
            low->next = q->next;
            q->next = p->next;
            p->next = q;
            p = q->next;
            q = low->next;
        }
    }
};


(5)題目:Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given1->4->3->2->5->2and x = 3,
return1->2->2->4->3->5..

思路:
(1)新建兩個節點分別為fast和slow,分別指向兩個頭結點;
(2)從頭到尾遍歷,小於x值的節點連線到p1,大於等於x的值的節點連結到p2;
(3)最後將兩個連結串列相連。

程式碼實現:

class Solution {
public:
    ListNode *partition(ListNode *head, int x) {
        if(head == NULL)
            return NULL;
        ListNode* fast = new ListNode(0);
        ListNode* slow = new ListNode(0);
        ListNode* p1 = slow;
        ListNode* p2 = fast;
        ListNode *p = head;
        while(p!=NULL)
        {
            if(p->val < x)
            {
                p1->next = p;
                p1 = p1->next;
            }
            else
            {
                p2->next = p;
                p2 = p2->next;
            }
            p = p->next;
        }
        p2->next = NULL;
        p1->next = fast->next;
        return slow->next;
    }
};

相關推薦

程式設計練習連結串列習題

(1)題目:輸入兩個連結串列,找出它們的第一個公共節點。 思路: 1)計算出連結串列1的長度; 2)計算出連結串列2的長度; 3)計算出連結串列1和連結串列2的長度差dif;

資料結構與演算法之連結串列

連結串列作為一種基礎的資料結構之一,我們會常常使用到它,接下來就讓我們一起學習吧。 1、連結串列的經典應用場景: LRU快取淘汰演算法。 2、快取是一種提高資料讀取效能的技術,在硬體設計、軟體開發中都有著非常廣泛的應用,比如常見的CPU快取、資料庫快取、瀏覽器快取等等。

CFF程式設計練習公共鑰匙盒Java

CFF程式設計練習:公共鑰匙盒(Java) 問題描述:   有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。   鑰匙盒一共有N個

資料結構實現連結串列C++版

資料結構實現(六):連結串列棧(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 入棧操作 2.2 出棧操作 2.3 查詢操作 2.4 其他操作 3. 演算法複雜度分析 3.1

雙向連結串列習題牛客網習題

【說明】設有一個帶表頭結點的雙向迴圈連結串列L,每個結點有4個數據成員:指向先驅結點的指標prior、指向後繼結點的指標next、存放資料的成員data和訪問頻度freq。所有結點的freq初始時都為0.每當在連結串列上進行一次L.Locate(x)操縱時,令元

Windows Phone開發10常用控件

androi chm att size near grid txt idt inf Windows Phone的控件有幾個來源,和傳統的桌面應用程序開發或Web開發一樣,有默認提供的控件和第三方開者發布的控件。一般而言,如果不是過於復雜的界面布局,使用默認控件就足矣。相比之

UVM序列篇之二sequence和item

技術 一點 目標 idt 需要 開始 掛載 ron 前行 無論是自駕item,穿過sequencer交通站,通往終點driver,還是坐上sequence的大巴,一路沿途觀光,最終跟隨導遊停靠到風景點driver,在介紹如何駕駛item和sequence,遵守什麽交規,最終

手機攝影黃埔軍校舊址

沒有 發布 一點 雙層 大學城 裏的 事情 手機拍 後繼 作者:馬健 郵箱:[email protected]發布:2018.01.06 2017年底我由於某個意外造成周日在廣州長洲島滯留,於是去拜訪了長洲島上最著名的古跡:黃埔軍校舊址。以前看影視劇的時候

VUE2中文文檔深入組件

支持 導出 urn opener org 表達式 hub 修改 activate 組件註冊 組件名稱 命名方案 可以通過兩種可選方式,定義組件名稱: 串聯式命名(kebab-case) Pascal 式命名(PascalCase)使用串聯式命名(kebab-cas

Java設計模式簡介行為型模式

本章講到第三種設計模式——行為型模式,共11種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。 先來張圖,看看這11中模式的關係: 第一類:通過父類與子類的關係進行實現。第二類:兩個類之間。第三類:類的狀態。第

資料結構與演算法之連結串列

Q:如何輕鬆寫出正確的連結串列程式碼? 總結起來,就是投入時間+技巧; 一、投入時間:          只要願意投入時間,大多數人都是可以學會的,比如說,如果你真能花上一個週末或者一整天時間,就去寫連結

【TeeChart Pro ActiveX教程】ADO資料庫訪問

下載TeeChart Pro ActiveX最新版本 介紹 將TeeChart控制元件連線到ADO.NET資料庫可以在設計時使用TeeChart編輯器完成,並在執行時使用幾行程式碼完成。 任何Series都可以使用TeeChart Editor連線到ADO.NET表或查詢。每個系列

程式設計師程式碼面試指南 —— 連結串列問題

題目:將單鏈表的每K個節點之間逆序 描述:給定一個單鏈表的頭結點head,實現一個調整單鏈表的函式,使得每K個節點之間逆序,如果最後不夠K個節點一組,則不調整最後幾個節點 例如: 連結串列 1—>2—>3—>4—>5—>6—>7—>8—>nul

程式設計師程式碼面試指南 —— 連結串列問題

題目:複製含有隨機指標節點的連結串列 描述:有一種連結串列節點類描述如下: public class Node { public int value; public Node next; public Node rand; public Node(int data){ this.value

程式設計師程式碼面試指南 —— 連結串列問題

題目:給定一個連結串列的頭節點head,請你判斷是否為迴文結構 例如:1 —> 2 —> 1 ture 1 —> 2 —> 2 —> 1 true 1 —> 2 —> 3 flase 思路:可以使用棧這種資料結構,可以將整個單向連結串列分為前半區和後

程式設計師程式碼面試指南 —— 連結串列問題

注:題目來自於《程式設計師程式碼面試指南:IT名企演算法與資料結構題目最優解》,該書是左程雲老師的著作,值得推薦,這裡僅是記錄一下該書中題目的解法和個人理解 題目一:在單鏈表和雙鏈表中刪除倒數第K個節點 描述:   分別實現兩個函式,一個可以刪除單鏈表中倒數第K個節點,另一個可以刪除雙鏈

windows 程式設計 第三章讀書筆記

     孃的,今天晚上在陽臺做飯把水管一腳踢爆了,水流到下面的住戶的陽臺,讓個老孃們把我罵了一頓,本著做錯事的原則,我裝的很紳士還說了個對不起,擦,真是條純漢子,能屈能伸。    

程式設計練習題括號配對問題Java

問題描述:問題描述 : 輸入一個字串 裡面只含有 [ , ] , ( , ) 四種括號 ; 現要求判斷這個字串 是否滿足括號匹配 如 ([])() 是匹配的 ([)]是不匹配的

極客講堂之資料結構與演算法之美複雜度分析

(本文根據極客講堂——資料結構與演算法之美專欄的問答區整理修改而成,如有侵權還希望聯絡我鴨~) 一、什麼是複雜度分析? 1.資料結構和演算法解決是“如何讓計算機更快時間、更省空間的解決問題”。 2.因此需從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。 3.分別

Nodejs非同步流程控制

function oneFun() { // setTimeout(function () { // console.log("a"); // }, 1000); i = 0; setInterval(function () {