1. 程式人生 > >單鏈表是否有環,環的長度,以及環的起始點

單鏈表是否有環,環的長度,以及環的起始點

尋找倒數第k個結點

public void  lastk(int k){
        Entry cur1=head;
        Entry cur2=head;
        if(k<0||k>getlength()){
            System.out.println("超出連結串列範圍");
        }
        while(k-1>0){//當k合法的時候,讓cur1先往後移動,比如要尋找倒數第二個結點,則讓cur1先往後移動倆次
            cur1=cur1.next;
            k--;
        }
        while
(cur1.next!=null){//cur1先移動之後,讓cur1與cur2同時移動 cur1=cur1.next; cur2=cur2.next; if(cur1.next==null){//當cur1移動到最後一個結點時,cur2此時就是我們需要找出的結點 System.out.println(cur2.data); } } }

程式碼原理:
讓cur1先往後移動,比如要尋找倒數第二個結點,則讓cur1先往後移動倆次,然後cur1 cur2同時向後移動,直到cur1移動到最後一個結點,此時,cur2就移動到了我們需要找的結點。

判斷一個連結串列是否有環:

public boolean isloop(){//判斷是否有環
    Entry fast=head;
    Entry slow=head;

    while(fast!=null&&fast.next!=null)
    {
        fast=fast.next.next;
        slow=slow.next;
        if(fast==slow){
            return true;
        }
    }
    return false;



}

設定兩個指標(fast, slow),初始值都指向頭結點,slow每次前進一步,fast每次前進二步,如果連結串列存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。

計算環的長度:




public void getLoopLength(){
    Entry fast = head;
    Entry slow = head;


    while(fast != null && fast.next != null){
        fast = fast.next.next;
        slow = slow.next;

        //輸出環長
        while(fast == slow) {

            int len = 0;
            fast = fast.next.next;
            slow = slow.next;
            while (fast != slow) {
                len++;
                fast = fast.next.next;
                slow = slow.next;



            }System.out.println("環長度為:"+len);
        }
        }
    }

從第一次相遇點也就是環的起始位置開始,快慢指標同時繼續移動,直到下次二者相遇,慢指標走過的長度就是環的長度

尋找環的起點

public void begin()
{
    Entry fast=head;
    Entry slow=head;
while(fast!=null&&fast.next!=null)
{
fast=fast.next.next;
slow=slow.next;
if(fast==slow){
    break;}

}
Entry a=head;
while (a != slow) {
    a = a.next;//讓a從頭結點開始,slow從相遇點開始,當倆者再次相遇的結點就是環的起始結點
    slow = slow.next;

}
System.out.println(slow.data);


}

如圖所示這裡寫圖片描述
從表頭到入口點的距離,等於從相遇點到入口點的距離。

判斷倆個單鏈表是否相交

public static void   cteatcut(TestLink t1,TestLink t2){//先建立倆個有交點的單鏈表
        TestLink.Entry head1=t1.getHead();
        TestLink.Entry head2=t2.getHead();
        head1.next.next=head2.next.next;
            }
    public static boolean iscut(TestLink t1,TestLink t2){
        TestLink.Entry head1=t1.getHead();
        TestLink.Entry head2=t2.getHead();

        int len1=t1.getlength();
        int len2=t2.getlength();
        int my_len=len1-len2;
        if(my_len<0){//為了保證len1代表的是比較長的單鏈表
            len1=t2.getlength();
            len2=t1.getlength();
                    }
        for(int i=0;i<my_len;i++){//讓長的單鏈表先向後移動my—len個結點,此時,倆個連結串列才相當於在同個起跑線上
            head1=head1.next;
        }
        while(head1!=null&&head2!=null&&head1!=head2){//遍歷倆個單鏈表,如果有一樣的結點,則說明倆個單鏈表有交點
            head1=head1.next;
            head2=head2.next;
        }
        if(head1==head2&&head1!=null){
            return true;
        }else{
            return false;
        }

    }

單鏈表的逆置

    public  void nizhi1(){//逆順列印
        Entry newhead=null;
        Entry prev=null;
        Entry cur=head;
        while(cur!=null){
            Entry curnest=cur.next;
            if(curnest==null){
                newhead=cur;
            }
            cur.next=prev;
            prev=cur;
            cur=curnest;
        }
    }

相關推薦

單鏈是否長度以及起始

尋找倒數第k個結點 public void lastk(int k){ Entry cur1=head; Entry cur2=head; if(k<0||k>getlength()){

單鏈是否的大小第一個連線單鏈長度

給定一個單鏈表,只給出頭指標h: 1、如何判斷是否存在環? 2、如何知道環的長度? 3、如何找出環的連線點在哪裡? 4、帶環連結串列的長度是多少? 下面是實現,可以相互檢查一下是否不正確。

判斷單鏈是否如果找出的入口位置=>求兩個相交連結串列的交點

首先如何判斷一個連結串列是否有環: 設定兩個指標(fast, slow),初始值都指向頭,slow每次前進一步,fast每次前進二步,如果連結串列存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。(當然,fast先行頭到尾部為NULL,則為無環連結串列

筆試題:判斷一個單鏈是否如果找出起始位置

</pre><pre name="code" class="cpp">Node * FindLoop(Node *phead) { Node *p = phead,q = phead,h = phead; while(p && q->next)

判斷單鏈是否並找出的入口【python】

問題: 1、如何判斷一個連結串列是不是這類連結串列? 2、如果連結串列為存在環,如果找到環的入口點? 一、判斷連結串列是否存在環,辦法為: 設定兩個指標(fast, slow),初始值都指向頭,slow每次前進一步,fast每次前進二步,如果連結串列存在環,則fast必定先進入環,而slow後進入環

如何判斷單鏈是否的入口、長度和總長

問題描述 1.如何判斷單鏈表是否有環? 2.如果有環,求出環的入口 3.求環長 4.求總長 探討 要想判斷有環,我們可以聯絡實際生活中的例子,很容易就想到操場上跑圈,因為是環形,所以快的肯定會追上慢的,所以我們可以應用到連結串列上,用一個快

11.判斷單鏈是否

兩個指針 next 測試 重載 else reader sta clas 復雜度 判斷單鏈表是否有環: 這裏也是用到兩個指針,如果一個鏈表有環,那麽用一個指針去遍歷,是永遠走不到頭的。 因此,我們用兩個指針去遍歷:first指針每次走一步,second指針每次走兩步

判斷單鏈是否

plc .html weibo app sin pla mpc html cnblogs 辜鈉魯u0ri0忌蠱負http://huiyi.docin.com/txqq_8fb449e9c9儼夾銥43gi1鑰倚蚜http://www.docin.com/app/user/us

如何判斷一個單鏈是否

算法 查找 public class LinkedListRing{ static class LinkedNode<T>{ private T t ; private LinkedNode<T> next = null; public LinkedNode(T t)

單鏈是否問題

開始 數字 info ptc data 下一個 nbsp 有環 ret 小咖是某計算機專業的學生。linglingling,伴隨這鈴聲,同學們都準時來上課了。 老師:這節課是計算機課,我們學習了單鏈表,請同學說一下什麽是單鏈表。 同學們紛紛舉起了手。好,小白你來說

JS-單鏈是否以及的入問題

給定一個連結串列,判斷連結串列中是否有環。 進階: 你能否不使用額外空間解決此題? 方案1 雜湊表 雜湊表是最容易理解的一個方案 建立一個雜湊表,如果不存在就向雜湊表中新增資料,存在的話就直接返回true(存在的可能只有P點,同時P點也是環的入點(這個和下一道題

單鏈是否入口【轉】

1.限制與要求 不允許修改連結串列結構。 時間複雜度O(n),空間複雜度O(1)。 2.思考 2.1判斷是否有環 如果連結串列有環,那麼在遍歷連結串列時則會陷入死迴圈,利用這個特徵,我們可以設計這樣的演算法。 使用一個slow指標,一個fast指標。 slow

演算法之(二)判斷一個單鏈是否

思路:如果一個單鏈表中有環,用一個指標去遍歷,永遠不會結束,所以可以用兩個指標,一個指標一次走一步,另一個指標一次走兩步,如果存在環,則這兩個指標會在環內相遇,時間複雜度為O(n)。 拓展問題1:如果單鏈表有環,找出環的入口節點(環的連線點)。 這裡先證明一個

【LeetCode-面試演算法經典-Java實現】【142-Linked List Cycle II(單鏈II)】

原題   Given a linked list, return the node where the cycle begins. If there is no cycle, retu

Java演算法:判斷單鏈是否

README 單鏈表是否有環,這是一個挺有意思的問題,這裡我並沒有提出新的解法,而是解釋了現有的解法,幫助新人和自己理解。 題目描述 判斷一個單鏈表是否有環,如果有,返回第一個環內的節點的引用,如果沒有環,返回nuill。 程式設

如何判斷一個單鏈是否以及入口

這是一個在我們學習資料結構的時候經常會遇到的問題,今天給大家帶來這個問題的幾種解法。 方法一 最容易想到的辦法就是遍歷單鏈表,如果單鏈表有環的話那麼會進入死迴圈,但是我們不知道單鏈表的長度,所以如果單鏈表長度很長,我們一直向下遍歷,也無法分辨出是單鏈表還

迴圈連結串列的特性以及判斷單鏈是否(九)

typedef struct CLinkList { int data; struct CLinkList* next; }node; typedef struct CLinkList* LinkList; int compareStep(LinkList L) { LinkList cur1 = L;

單鏈是否(Java版)

題目:判斷一個帶頭結點的單鏈表L是否有環 解題思路: 咋看之下,這題還真不好解,於是又一些投機取巧的人,在訪問單鏈表中元素的時候,用一個比較大的數N控制訪問元素的個數,他們認為如果在訪問到第N個元素之

Java判斷單鏈是否的兩種實現方法

http://blog.jobbole.com/106227/ 方法一:首先從頭節點開始,依次遍歷單鏈表的每一個節點。每遍歷到一個新節點,就從頭節點重新遍歷新節點之前的所有節點,用新節點ID和此節點之前所有節點ID依次作比較。如果發現新節點之前的所有節點當中存

判斷一個單鏈是否

主函式中沒有出現具體的連結串列,主要看判斷有無環函式ExitLoop. 外函式的while迴圈條件的判定:如果fast指標指向NULL,if條件語句不成立,返回flag=0:不存在環。 如果flag走到最後一個結點時,要是不給定一個條件,while繼續執行,flag一次迴圈