1. 程式人生 > >【單鏈表】快慢指針原理-Java語言

【單鏈表】快慢指針原理-Java語言

ros public author print 單鏈表 for nod 根據 獲得

1.結點類

package blog;

/**
 * @Description: 結點類
 * @author: liuqiang
 * @Date: 2018/12/28 23:33
 */
public class Node {
    public String data; // 結點的數據域
    public Node next; // 結點的指針域

    public Node() {
    }

    // 構造方法時給data賦值
    public Node(String data) {
        this.data = data;
    }
    
}

2.單鏈表類

package bolg;

/**
 * @Description: 單鏈表類
 * @author: liuqiang
 * @Date: 2018/12/28 23:38
 */
public class LinkList {
    private Node head; // 頭結點
    
    // 調用LinkList構造方法時初始化head
    public LinkList() {
        head = new Node();
    }

    /**
     * @Description: 尾插法插入結點
     * @param: [node]
     * @return
: void * @author: liuqiang * @updateTime: 2018/12/28 23:53 */ public void addNode(Node node) { Node temp = head; // 把頭結點看做一個指向結點的指針 while (temp.next != null) { // 遍歷單鏈表,直到遍歷最後的元素則跳出 temp = temp.next; // 指針指向下一個結點 } temp.next = node; // 將node指向最後一個結點
} /** * @Description: 計算鏈表的長度 * @param: [] * @return: int * @author: liuqiang * @updateTime: 2018/12/28 23:58 */ public int length() { int length = 0; Node temp = head; while (temp.next != null) { length++; temp = temp.next; } return length; } /** * @Description: 在指定位置插入結點 * @param: [index, node] * @return: void * @author: liuqiang * @updateTime: 2018/12/30 14:29 */ public void insert(int index, Node node) { if (index < 1 || index > length() + 1) { System.out.println("插入位置不合法"); return; } int length = 1; // 記錄遍歷到的位置 Node temp = head; // 可移動的指針 while (head.next != null) { // 遍歷單鏈表 if (index == length) { node.next = temp.next; temp.next = node; return; } temp = temp.next; } } /** * @Description: 根據位序數刪除結點 * @param: [index] * @return: void * @author: liuqiang * @updateTime: 2018/12/30 14:44 */ public void delete(int index) { // 判斷index是否合理 if (index < 0 || index > length()) { System.out.println("刪除位置不合理"); return; } int length = 1; Node temp = head; while (temp.next != null) { if (index == length) { temp.next = temp.next.next; return; } temp = temp.next; length++; } } /** * @Description: 打印單鏈表的數據 * @param: [] * @return: void * @author: liuqiang * @updateTime: 2018/12/30 19:52 */ public void print() { Node temp = head.next; for (int i = 1; i <= length(); i++) { System.out.println("第" + i + "個結點的數據為" + temp.data); temp = temp.next; } } /** * @Description: 獲取中間結點的數據 * @param: [linkList] * @return: void * @author: liuqiang * @updateTime: 2018/12/30 19:14 */ public void getMidNode(LinkList linkList) { Node search = linkList.head; // 定義一個快結點 Node mid = linkList.head; // 定義一個慢結點 while (search.next != null) { // 遍歷單鏈表 if (search.next.next != null) { // 如果快結點的下下個結點不為空,則說明離最後一個結點至少還有兩個結點,往後走兩個結點 search = search.next.next; } else { // 如果快結點的下下個結點為空,但下個結點不為空, // 則說明單鏈表的結點數為奇數,往後走一個結點即到達最後一個結點 search = search.next; } mid = mid.next; } System.out.println(mid.data); } }

3.測試代碼

package bolg;

/**
 * @Description: 測試類
 * @author: liuqiang
 * @Date: 2018/12/30 14:48
 */
public class Test {
    public static void main(String[] args) {
        LinkList linkList = new LinkList();
        // 往單鏈表中插入多個結點
        for (int i = 1; i < 12; i++) {
            Node node = new Node("結點" + i);
            linkList.addNode(node);
        }

        linkList.getMidNode(linkList); // 調用獲得中間結點數據的函數
    }
}

4.輸出結果:結點6

【單鏈表】快慢指針原理-Java語言