1. 程式人生 > 實用技巧 >java 資料結構單鏈表的操作

java 資料結構單鏈表的操作

一、手寫一個單鏈表

  

public class ListNode<T>{

    /**
     * 資料
     */
    public T obj;
    /**
     * tail 指標
     */
    public ListNode next;

    ListNode(T obj){
        this.obj = obj;
    }

}

  建立單鏈表工具類

public class ListNodeUtils {

    /**
     * 單鏈表頭部插入新節點
     * @param head 連結串列頭節點
     * @param newHead 要插入的頭節點
     */
    public static void insertHead(ListNode head, ListNode newHead){
        ListNode oldHead = head; //儲存原頭節點
        head = newHead; //新的頭節點賦值給原頭節點
        head.next = oldHead; //新的頭節點指向原頭節點
    }

    /**
     * 單鏈表尾部插入新節點
     * @param tail 連結串列尾節點
     * @param newTail 要插入的尾節點
     */
    public static void insertTail(ListNode tail, ListNode newTail){
        ListNode oldTail = tail; //儲存原來的尾節點
        tail = newTail;//賦值新的尾節點給原來的尾節點
        oldTail.next = tail;//舊的尾節點指向新的尾節點
        tail.next = null;//新的尾節點指向NULL
    }

    /**
     * 單鏈表在node1之後插入node2
     * @param node1
     * @param node2
     */
    public static void insetNode(ListNode node1, ListNode node2){
        ListNode next = node1.next;//儲存原節點的下個節點
        node1.next = node2;//node1節點指向node2節點
        node2.next = next;//node2節點指向node1的下個節點
    }

    /**
     * 刪除節點
     * @param head
     * @param delNode
     */
    public static void delNode(ListNode head, ListNode delNode){
        //刪除非 尾節點
        if(delNode != null && delNode.next != null){
            ListNode next = delNode.next;//儲存下個節點
            delNode.obj = next.obj;//將下個節點的值賦值給當前節點
            delNode.next = next.next;//將該節點指向下個節點的下個節點
            next = null;//釋放需要刪除的節點
        }
        //刪除尾節點
        if(delNode.next == null){
            while (head != null){
                if(head.next != null && head.next == delNode){
                    head.next = null;
                    delNode = null;
                }
                head = head.next;
            }
        }

    }

    /**
     * 查詢節點
     * @param head 頭節點
     * @param obj 需要查詢節點
     */
    public static <T> int findNode(ListNode head, T obj){
        int index = 0;
        while (head != null){
            if(head.obj.equals(obj)){
                return index;
            }
            index ++;
            head = head.next;
        }
        return index;
    }

    /**
     * 遍歷單鏈表
     * @param head 頭節點
     */
    public static void cycleNode(ListNode head){
        while(head != null){
            System.out.print(head.obj + "; ");
            head = head.next;
        }
        System.out.println();
    }

}

  測試單鏈表工具類的方法

    public static void main(String[] args) {
        //建立三個節點
        ListNode listNode1 = new ListNode("這是節點1");
        ListNode listNode2 = new ListNode("這是節點2");
        ListNode listNode3 = new ListNode("這是節點3");
        //建立節點指向關係
        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = null;

        cycleNode(listNode1);

        //頭部插入測試
        ListNode listNode0 = new ListNode("這是節點0");
        insertHead(listNode1, listNode0);
        cycleNode(listNode0);

        //尾部插入測試
        ListNode listNode4 = new ListNode("這是節點4");
        insertTail(listNode3, listNode4);
        cycleNode(listNode0);

        //中間插入  node2後插入 node5
        ListNode listNode5 = new ListNode("這是節點5");
        insetNode(listNode2, listNode5);
        cycleNode(listNode0);

        //刪除節點
        delNode(listNode0, listNode5);
        cycleNode(listNode0);

        //查詢節點
        System.out.println(findNode(listNode0, "這是節點3"));
    }

  執行結果:

這是節點1; 這是節點2; 這是節點3; 
這是節點0; 這是節點1; 這是節點2; 這是節點3; 
這是節點0; 這是節點1; 這是節點2; 這是節點3; 這是節點4; 
這是節點0; 這是節點1; 這是節點2; 這是節點5; 這是節點3; 這是節點4; 
這是節點0; 這是節點1; 這是節點2; 這是節點3; 這是節點4; 
3