java 資料結構單鏈表的操作
阿新 • • 發佈:2020-08-11
一、手寫一個單鏈表
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