溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java之單鏈表問(wèn)題的示例分析

發(fā)布時(shí)間:2021-08-04 10:44:54 來(lái)源:億速云 閱讀:128 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)Java之單鏈表問(wèn)題的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

單鏈表

單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素。

鏈表中的數(shù)據(jù)是以結(jié)點(diǎn)來(lái)表示的,每個(gè)結(jié)點(diǎn)的構(gòu)成:元素(數(shù)據(jù)元素的映象) + 指針(指示后繼元素存儲(chǔ)位置),元素就是存儲(chǔ)數(shù)據(jù)的存儲(chǔ)單元,指針就是連接每個(gè)結(jié)點(diǎn)的地址數(shù)據(jù)。

問(wèn)題

問(wèn)題1:給定一個(gè)單鏈表,判斷鏈表中是否有環(huán)

問(wèn)題2:給定一個(gè)鏈表,返回鏈表開(kāi)始入環(huán)的第一個(gè)節(jié)點(diǎn),如果無(wú)環(huán),則返回null

class Node{
    public int data;
    Node next;
    public Node(int data){
        this.data=data;
        this.next=null;
    }
}
public class linkedList {
    /*給定一個(gè)鏈表,判斷鏈表中是否有環(huán)
    思路: 如果鏈表有環(huán)的話,定義兩個(gè)節(jié)點(diǎn)fast,slow。讓fast一次走兩步,slow一次走一步;
    如果能相交,即fast=slow,說(shuō)明有交點(diǎn),且如果有環(huán),節(jié)點(diǎn)的next也不會(huì)為空
     */
    public Node head;
    public boolean hasCycle(){
        Node fast=this.head;
        Node slow=this.head;
        while (fast!=null&&fast.next!=null){//如果把fast.next寫(xiě)下前面,一旦fast為空,則會(huì)空指針異常
            fast=fast.next.next;
            slow=slow.next;
            if(fast==slow){
                return true;
            }
        }
        return false;
    }
    
    //給定一個(gè)鏈表,返回鏈表開(kāi)始入環(huán)的第一個(gè)節(jié)點(diǎn),如果無(wú)環(huán),則返回null
    public Node detectCycle(){
        /*定義fast與slow,fast前進(jìn)2格,slow前進(jìn)一格,如果有交點(diǎn)的話,fast與slow第一次相遇時(shí),fast的路程為slow的2倍,
        如設(shè)從頭節(jié)點(diǎn)到入環(huán)節(jié)點(diǎn)的距離為X,令入環(huán)節(jié)點(diǎn)到fast,slow第一次相遇距離為Y,環(huán)的總長(zhǎng)度為C的話;可得公式:2(X+Y)=X+Y+NC;
        得X=NC-Y,令N等于1,X=C-Y;此時(shí)讓slow從頭節(jié)點(diǎn)開(kāi)始走,當(dāng)于速度相同的fast相遇時(shí),則為入環(huán)的節(jié)點(diǎn)。
        */
        Node fast=this.head;
        Node slow=this.head;
        while (fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
            if(fast==slow){//第一次相遇  
                break;
            }
        }
        if(fast==null&&fast.next==null){
            return null;
        }
        //此時(shí)讓slow從頭節(jié)點(diǎn)開(kāi)始,與fast以相同速度前進(jìn),遇到則為入環(huán)的第一個(gè)節(jié)點(diǎn)
        slow=this.head;
        while (fast!=slow){
            fast=fast.next;
            slow=slow.next;
        }
        return slow;
    }
}

感謝各位的閱讀!關(guān)于“Java之單鏈表問(wèn)題的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI