Java之單鏈表問題解決案例講解
單鏈表
單鏈表是一種鏈式存取的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素。
鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) + 指針(指示後繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。
問題
問題1:給定一個單鏈表,判斷鏈表中是否有環
問題2:給定一個鏈表,返回鏈表開始入環的第一個節點,如果無環,則返回null
class Node{ public int data; Node next; public Node(int data){ this.data=data; this.next=null; } } public class linkedList { /*給定一個鏈表,判斷鏈表中是否有環 思路: 如果鏈表有環的話,定義兩個節點fast,slow。讓fast一次走兩步,slow一次走一步; 如果能相交,即fast=slow,說明有交點,且如果有環,節點的next也不會為空 */ public Node head; public boolean hasCycle(){ Node fast=this.head; Node slow=this.head; while (fast!=null&&fast.next!=null){//如果把fast.next寫下前面,一旦fast為空,則會空指針異常 fast=fast.next.next; slow=slow.next; if(fast==slow){ return true; } } return false; } //給定一個鏈表,返回鏈表開始入環的第一個節點,如果無環,則返回null public Node detectCycle(){ /*定義fast與slow,fast前進2格,slow前進一格,如果有交點的話,fast與slow第一次相遇時,fast的路程為slow的2倍, 如設從頭節點到入環節點的距離為X,令入環節點到fast,slow第一次相遇距離為Y,環的總長度為C的話;可得公式:2(X+Y)=X+Y+NC; 得X=NC-Y,令N等於1,X=C-Y;此時讓slow從頭節點開始走,當於速度相同的fast相遇時,則為入環的節點。 */ 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; } //此時讓slow從頭節點開始,與fast以相同速度前進,遇到則為入環的第一個節點 slow=this.head; while (fast!=slow){ fast=fast.next; slow=slow.next; } return slow; } }
到此這篇關於Java之單鏈表問題解決案例講解的文章就介紹到這瞭,更多相關Java之單鏈表問題內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 教你如何輕松學會Java快慢指針法
- C++實現LeetCode(141.單鏈表中的環)
- C++數據結構之鏈表詳解
- Java 八道經典面試題之鏈表題
- Java實現單鏈表SingleLinkedList增刪改查及反轉 逆序等