日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

《剑指Offer》23:链表中环的入口节点

發(fā)布時(shí)間:2023/12/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《剑指Offer》23:链表中环的入口节点 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目

若一個(gè)鏈表中包含環(huán),如何找出的入口結(jié)點(diǎn)?如下圖鏈表中,環(huán)的入口節(jié)點(diǎn)的節(jié)點(diǎn)3。

分析

  • 一快(移兩節(jié)點(diǎn))一慢(移一節(jié)點(diǎn))兩指針判斷鏈表是否存在環(huán)。
  • 算出環(huán)有幾個(gè)節(jié)點(diǎn)(上一步的兩指針可知是在環(huán)中,讓慢指針停止遍歷,讓快指針改為一節(jié)點(diǎn)一節(jié)點(diǎn)然后兩指針一動(dòng)一靜的計(jì)算出環(huán)有多少個(gè)節(jié)點(diǎn))。
  • 重置兩指針指向鏈頭,一指針移動(dòng)2. 步驟得出n,然后兩指針一起移動(dòng)。當(dāng)兩指針相遇,此時(shí)它們指向的環(huán)的入口結(jié)點(diǎn)
  • 放碼

    import com.lun.util.SinglyLinkedList.ListNode;public class FindEntryNodeOfLoop {public ListNode find(ListNode head) {//1.判斷是否存在環(huán)ListNode meetNode = meetNode(head);if(meetNode == null) {return null;}int nodesInLoop = 1;ListNode node1 = meetNode;//2.計(jì)算環(huán)內(nèi)節(jié)點(diǎn)while(node1.next != meetNode) {nodesInLoop++;node1 = node1.next;}//3.先移動(dòng)node1, 次數(shù)為環(huán)中節(jié)點(diǎn)的數(shù)目node1 = head;for(int i = 0; i < nodesInLoop; i++)node1 = node1.next;ListNode node2 = head;while(node1 != node2) {node1 = node1.next;node2 = node2.next;}return node1;}public ListNode meetNode(ListNode head) {if(head == null)return null;ListNode slow = head.next;if(slow == null) {//鏈表只有一個(gè)節(jié)點(diǎn)return null;}ListNode fast = slow.next;while(fast != null && slow != null) {//可能循環(huán)幾次才能碰上if(fast == slow) {return fast;}slow = slow.next;fast = fast.next;if(fast != null) {fast = fast.next;}}return null;}}

    測(cè)試

    import static org.junit.Assert.*;import org.junit.Test;import com.lun.util.SinglyLinkedList; import com.lun.util.SinglyLinkedList.ListNode;public class FindEntryNodeOfLoopTest {@Testpublic void test() { FindEntryNodeOfLoop fl = new FindEntryNodeOfLoop();ListNode n1 = new ListNode(1);ListNode n2 = new ListNode(2);ListNode n3 = new ListNode(3);ListNode n4 = new ListNode(4);ListNode n5 = new ListNode(5);ListNode n6 = new ListNode(6);n1.next = n2;n2.next = n3;n3.next = n4;n4.next = n5;n5.next = n6;n6.next = n3;//n3為入口節(jié)點(diǎn)assertEquals(3, fl.find(n1).val);//沒(méi)有環(huán)的鏈表assertNull(fl.find(SinglyLinkedList.intArray2List(new int[] {1, 2, 3, 4, 5, 6})));}@Testpublic void test2() {FindEntryNodeOfLoop fl = new FindEntryNodeOfLoop(); assertNull(fl.meetNode(SinglyLinkedList.intArray2List(new int[] {1, 2, 3, 4, 5, 6})));}}

    總結(jié)

    以上是生活随笔為你收集整理的《剑指Offer》23:链表中环的入口节点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。