百科
單鏈表是一種鏈式存取的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素。鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) + 指針(指示后繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。
圖解
單鏈表中每個結點的存儲地址是存放在其前趨結點next域中,而開始結點無前趨,故應設頭指針head指向開始結點。鏈表由頭指針唯一確定,單鏈表可以用頭指針的名字來命名。最后一個節點,其中的next指向NULL。
代碼實現
-
節點類
static Node head=new Node(); static class Node{ int data; Node next; public Node() {//無參構造方法,默認data為0 } public Node(int data) {//帶data構造方法 this.data=data; } }
-
添加節點
/* * 添加節點,尾插法 */ public void addNode(int data) { Node node = new Node(data);//創建新節點對象 Node temp = head; while(temp.next != null) {//找到當前鏈表尾結點 temp=temp.next; } temp.next=node; }
-
遍歷節點
/* * 遍歷鏈表 */ public void printNode() { Node temp = head.next; while(temp!=null) { System.out.print(temp.data+" "); temp=temp.next; } System.out.println(); }
-
統計鏈表長度
/* * 統計鏈表長度 */ public static int length() { int length=0; Node temp = head;//head為頭指針,不算作鏈表節點 while(temp.next!=null) { length++; temp=temp.next; } return length; }
-
插入節點
/* * 通過索引插入節點 */ public void insertNode(int index,int data) { int size = length()+1;//+1是因為尾部插入的索引值是當前鏈表尾結點后一個哦,不是尾結點的索引 if(index==size) { //在鏈表尾部插入則直接調用addNode方法 addNode(data); return; } if(index<1||index>size) { System.out.println("不正確的位置索引"); return; } Node temp=head; Node node = new Node(data); int length=1; while(temp.next!=null) { if(index==length++) {//先判斷是否相等,然后length++ node.next=temp.next; temp.next=node; return; } temp=temp.next; } }
-
刪除尾結點
/* * 刪除尾結點 */ public void popNode() { Node temp = head; Node pre = temp; while(temp.next!=null) { pre=temp; temp=temp.next; } pre.next=null;//鏈表尾結點的next始終指向NULL }
-
通過索引刪除節點
/* * 通過索引刪除節點 */ public void deleteNode(int index) { if(index==length()) { //如果索引位置是尾結點位置,調用popNode方法 popNode(); return; } if(index<1||index>length()) { System.out.println("刪除節點位置索引不合法"); return; } Node temp=head; int length=1; while(temp.next!=null) { if(index==length++) { System.out.println(temp.data); //刪除只需要把要刪除節點的上一個節點的next指向刪除節點的下一個節點 temp.next=temp.next.next; return; } temp=temp.next; } }
關於單鏈表的基本操作就寫到這里了,當然關於鏈表的其他的一些操作我可能會出后續。。再會。。。