JAVA生成帶環的單向連結串列(針對leetcode是否有環那道題)
阿新 • • 發佈:2018-11-09
leetcode上面有一道題是判斷單向連結串列是否有環,方法基本上都是用快慢指標。
但是我突然想測試一下,但是不知道怎麼生成有環的連結串列,別說有環的,就是生成個連結串列都挺難的。
所以自己就在網上找了一下,發現生成連結串列還是有的。
但是沒有生成帶環的連結串列,所以自己總結了一下,寫了一個帶環的連結串列供大家檢視。
連結串列的實體如下:
package com.leetcode.linklist.po; public class ListNode { public int node; public ListNode next; public ListNode(int node, ListNode next) { this.node = node; this.next = next; } }
實現部分如下:
package com.leetcode.linklist; import org.mockito.asm.tree.IntInsnNode; import com.leetcode.linklist.po.ListNode; /** * 判斷連結串列是否存在環 * @author fei.meng * */ public class LinkList001 { static ListNode head; public static void main(String[] args) { init(); add(getNode(6));// 這裡面去第7個 print(); } /** * 連結串列初始化 */ public static void init() { for(int i=0;i<10;i++) { add(new ListNode(i, null)); } } /** * 為了生成環需要取到環節點的指標 * @param i * @return */ public static ListNode getNode(int i) { int count = 0; ListNode temp = head; while(temp.next != null) { if(count == i) { //return temp; break; } temp = temp.next; count++; } return temp; } /** * 連結串列的新增 * @param node */ public static void add(ListNode node) { ListNode temp = head; if(head == null) { head = node; return; } while(temp.next != null) { temp = temp.next; } temp.next = node; } /** * 列印連結串列 * 因為有環所以只迴圈了20次 * 實際上是無限迴圈的 */ public static void print() { StringBuffer buff = new StringBuffer(); ListNode temp = head; buff.append(temp.node); int count = 0; while(temp.next != null) { buff.append("->"); temp = temp.next; buff.append(temp.node); System.out.println(buff.toString()); count++; if(count == 20) { break; } } } /** * 判斷連結串列是否有環 * @param node * @return */ public static boolean isLinkedCycle(ListNode node) { if(node == null) { return false; } ListNode fast = node; ListNode slow = node; while(fast.next != null && fast.next.next != null) { slow = slow.next; fast = fast.next.next; if(slow == fast) { return true; } } return false; } }
好了,以上就是實現的全部過程,有問題留言。下班~~