詳細實現單鏈表的基本操作【Java版】


百科

單鏈表是一種鏈式存取的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素。鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) + 指針(指示后繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。

圖解

image.png

單鏈表中每個結點的存儲地址是存放在其前趨結點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;
    		}
    	}
    

    關於單鏈表的基本操作就寫到這里了,當然關於鏈表的其他的一些操作我可能會出后續。。再會。。。

更多內容大家可以訪問我的個人博客:一只大大怪


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM