您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java怎么確定一個鏈表有環及入口節點”,在日常操作中,相信很多人在Java怎么確定一個鏈表有環及入口節點問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java怎么確定一個鏈表有環及入口節點”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
var ,next,是單鏈表中的屬性,分別表示節點值和下一個節點的指向; 代碼如下:
//定義一個鏈表 class List{ public int var; public List next; //有參構造 public List(int var) { this.var = var; } //無參構造 public List() { } //創建一個帶環的鏈表 public List Create(){ List a = new List(1); List b = new List(2); List c = new List(3); List d = new List(4); List e = new List(5); List f = new List(6); a.next = b; b.next =c; c.next = d; d.next =e; e.next = f; f.next =d; return a; }
如果存在,則返回這個節點,如果不存在則返回null,定義快慢指針,如果快的追上了慢的指針,那么這個鏈表必存在環,如果沒有追上,或者都為null,那么這個鏈表沒有環; 代碼如下:
//判斷是否有環,并找到相遇的節點 public List MeetingNode(List node){ List slow = new List(); List fast = new List(); if(node==null) return null; slow = node.next; if(slow==null) return null; fast=slow.next; while (fast!=null && slow!=null){ if (fast==slow){ return fast; //fast追上了slow,確定是一個有環的鏈表; } slow = slow.next; fast = fast.next; if(fast!=null){ fast = fast.next; } } return null; }
先讓快指針先走環的節點的個數步,在讓慢指針開始走,如果兩個指針相遇的話,那么相遇的節點必然是環的入口節點 代碼如下:
public List Enterdear(List node){ if(node==null) return null; if(MeetingNode(node)==null) return null; int count =1; List res2; List res1 = MeetingNode(node); while (res1.next!=MeetingNode(node)){ res1 = res1.next; count++; } res1 = node; for(int i = 0;i<count;i++){ res1 =res1.next; } res2 = node; while (res1!=res2 && res1!=null && res2!=null){ res1 = res1.next; res2 = res2.next; } return res1; } }
main函數測試;
ublic class Deom { public static void main(String[] args) { List SB = new List(); List res = SB.Create(); List dear= SB.Enterdear(res); System.out.println(dear.var); } }
到此,關于“Java怎么確定一個鏈表有環及入口節點”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。