鏈表

  • 現(xiàn)在有一個(gè)單向鏈表邀杏,談一談贫奠,如何判斷鏈表中是否出現(xiàn)了環(huán)

考察點(diǎn):鏈表
參考回答:
單鏈表有環(huán),是指單鏈表中某個(gè)節(jié)點(diǎn)的next指針域指向的是鏈表中在它之前的某一個(gè)節(jié)點(diǎn),這樣在鏈表的尾部形成一個(gè)環(huán)形結(jié)構(gòu)叮阅。
// 鏈表的節(jié)點(diǎn)結(jié)構(gòu)如下 typedef struct node { int data; struct node *next; } NODE;
最常用方法:定義兩個(gè)指針刁品,同時(shí)從鏈表的頭節(jié)點(diǎn)出發(fā),一個(gè)指針一次走一步浩姥,另一個(gè)指針一次走兩步挑随。如果走得快的指針追上了走得慢的指針,那么鏈表就是環(huán)形鏈表勒叠;如果走得快的指針走到了鏈表的末尾(next指向 NULL)都沒(méi)有追上第一個(gè)指針兜挨,那么鏈表就不是環(huán)形鏈表。
通過(guò)使用STL庫(kù)中的map表進(jìn)行映射眯分。首先定義 map<NODE *, int> m; 將一個(gè) NODE * 指針映射成數(shù)組的下標(biāo)拌汇,并賦值為一個(gè) int 類型的數(shù)值。然后從鏈表的頭指針開(kāi)始往后遍歷弊决,每次遇到一個(gè)指針p噪舀,就判斷 m[p] 是否為0。如果為0飘诗,則將m[p]賦值為1与倡,表示該節(jié)點(diǎn)第一次訪問(wèn);而如果m[p]的值為1昆稿,則說(shuō)明這個(gè)節(jié)點(diǎn)已經(jīng)被訪問(wèn)過(guò)一次了纺座,于是就形成了環(huán)。

  • 談一談溉潭,bucket如果用鏈表存儲(chǔ)净响,它的缺點(diǎn)是什么?

考察點(diǎn):鏈表
參考回答:

①查找速度慢喳瓣,因?yàn)椴檎視r(shí)馋贤,需要循環(huán)鏈表訪問(wèn)

②如果進(jìn)行頻繁插入和刪除操作,會(huì)導(dǎo)致速度很慢畏陕。

  • 有一個(gè)鏈表掸掸,奇數(shù)位升序偶數(shù)位降序,如何將鏈表變成升序

考察點(diǎn):鏈表
參考回答:

public class
OddIncreaseEvenDecrease {
    /**
     * 按照奇偶位拆分成兩個(gè)鏈表
     * @param head
     * @return
     */
    public static Node[] getLists(Node head){
        Node head1 = null;
        Node head2 = null;
        
        Node cur1 = null;
        Node cur2 = null;
        int count = 1;//用來(lái)計(jì)數(shù)
        while(head != null){
            if(count % 2 == 1){
                if(cur1 != null){
                    cur1.next = head;
                    cur1 = cur1.next;
                }else{
                    cur1 = head;
                    head1 = cur1;
                }
            }else{
                if(cur2 != null){
                    cur2.next = head;
                    cur2 = cur2.next;
                }else{
                    cur2 = head;
                    head2 = cur2;
                }
            }
            head = head.next;
            count++;
        }
        //跳出循環(huán)蹭秋,要讓最后兩個(gè)末尾元素的下一個(gè)都指向null
        cur1.next = null;
        cur2.next = null;
        
        Node[] nodes = new Node[]{head1,
head2};
        return nodes;
    }
    
    /**
     * 反轉(zhuǎn)鏈表
     * @param head
     * @return
     */
    public static Node reverseList(Node head){
        Node pre = null;
        Node next = null;
        while(head != null){
            next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
        return pre;
    }
     
    /**
     * 合并兩個(gè)有序鏈表
     * @param head1
     * @param head2
     * @return
     */
    public static Node CombineList(Node head1,
Node head2){
        if(head1 == null || head2 == null){
            return head1 != null ? head1 :
head2;
        }
        Node head = head1.value < head2.value ?
head1 : head2;
        Node cur1 = head == head1 ? head1 :
head2;
        Node cur2 = head == head1 ? head2 :
head1;
        Node pre = null;
        Node next = null;
        while(cur1 != null && cur2 !=
null){
            if(cur1.value <= cur2.value){//這里一定要有=,否則一旦cur1的value和cur2的value相等的話堤撵,下面的pre.next會(huì)出現(xiàn)空指針異常
                pre = cur1;
                cur1 = cur1.next;
            }else{
                next = cur2.next;
                pre.next = cur2;
                cur2.next = cur1;
                pre = cur2;
                cur2 = next;
            }
        }
        pre.next = cur1 == null ? cur2 : cur1;
        
        return head;
    }
    
}
  • 隨機(jī)鏈表的復(fù)制

考察點(diǎn):鏈表
參考回答:

public RandomListNode copyRandomList(RandomListNode head) {
  
    if (head == null)
        return null;
  
    RandomListNode p = head;
  
    // copy every node and insert to list
    while (p != null) {
        RandomListNode copy = new RandomListNode(p.label);
        copy.next = p.next;
        p.next = copy;
        p = copy.next;
    }
  
    // copy random pointer for each new node
    p = head;
    while (p != null) {
        if (p.random != null)
            p.next.random = p.random.next;
        p = p.next.next;
    }
  
    // break list to two
    p = head;
    RandomListNode newHead = head.next;
    while (p != null) {
        RandomListNode temp = p.next;
        p.next = temp.next;
        if (temp.next != null)
            temp.next = temp.next.next;
        p = p.next;
    }
  
    return newHead;
}
  • 如何反轉(zhuǎn)單鏈表

考察點(diǎn):鏈表
參考回答:

ListNode
reverseList(ListNode* head) {
        if(head == nullptr || head->next ==
nullptr)
            return head;
        ListNode* p;
        ListNode* q;
        ListNode* r;
        p = head;
        q = head->next;
        head->next = nullptr;//舊的頭指針是新的尾指針 指向NULL
        while(q){
            r = q->next;//用來(lái)保存下一步要處理的指針
            q->next = p;//p q 交替處理 進(jìn)行反轉(zhuǎn)單鏈表
            p = q;
            q = r;
        }
        head = p;//最后的q必定指向NULL仁讨,p就成了新鏈表的頭指針
        return head;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市实昨,隨后出現(xiàn)的幾起案子洞豁,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丈挟,死亡現(xiàn)場(chǎng)離奇詭異刁卜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)曙咽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)蛔趴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人例朱,你說(shuō)我怎么就攤上這事孝情。” “怎么了洒嗤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵箫荡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我渔隶,道長(zhǎng)羔挡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任间唉,我火速辦了婚禮绞灼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘终吼。我一直安慰自己镀赌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布际跪。 她就那樣靜靜地躺著商佛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姆打。 梳的紋絲不亂的頭發(fā)上良姆,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音幔戏,去河邊找鬼玛追。 笑死,一個(gè)胖子當(dāng)著我的面吹牛闲延,可吹牛的內(nèi)容都是我干的痊剖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼垒玲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼陆馁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起合愈,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叮贩,失蹤者是張志新(化名)和其女友劉穎击狮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體益老,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彪蓬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捺萌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片档冬。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖互婿,靈堂內(nèi)的尸體忽然破棺而出捣郊,到底是詐尸還是另有隱情,我是刑警寧澤慈参,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布呛牲,位于F島的核電站,受9級(jí)特大地震影響驮配,放射性物質(zhì)發(fā)生泄漏娘扩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一壮锻、第九天 我趴在偏房一處隱蔽的房頂上張望琐旁。 院中可真熱鬧,春花似錦猜绣、人聲如沸灰殴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牺陶。三九已至,卻和暖如春辣之,著一層夾襖步出監(jiān)牢的瞬間掰伸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工怀估, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狮鸭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓多搀,卻偏偏與公主長(zhǎng)得像歧蕉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子康铭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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