閱讀481 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java麵向對象基礎--鏈表的改進

采用內部類完成鏈表的操作

1、增加節點,在鏈表的最後進行增加

class Link{		// 鏈表的完成類
	class Node{	// 保存每一個節點,此處為了方便直接定義成內部類
		private String data ;	// 保存節點的內容
		private Node next ;		// 保存下一個節點
		public Node(String data){
			this.data = data ;		// 通過構造方法設置節點內容
		}
		public void add(Node newNode){		// 將節點加入到合適的位置
			if(this.next==null){			// 如果下一個節點為空,則把新節點設置在next的位置上
				this.next = newNode ;
			}else{		// 如果不為空,則需要向下繼續找next
				this.next.add(newNode) ;
			}
		}
		public void print(){
			System.out.print(this.data + "\t") ;	// 輸出節點內容
			if(this.next!=null){		// 還有下一個元素,需要繼續輸出
				this.next.print() ;	// 下一個節點繼續調用print
			}
		}
		
	};
	private Node root ;		// 鏈表中必然存在一個根節點
	public void addNode(String data){	// 增加節點
		Node newNode = new Node(data) ;	// 定義新的節點
		if(this.root==null){			// 沒有根節點
			this.root = newNode ;	// 將第一個節點設置成根節點
		}else{		// 不是根節點,放到最後一個節點之後
			this.root.add(newNode) ;	// 通過Node自動安排此節點放的位置
		}
	}
	public void printNode(){		// 輸出全部的鏈表內容
		if(this.root!=null){		// 如果根元素不為空
			this.root.print() ;	// 調用Node類中的輸出操作
		}
	}
};
public class LinkDemo02{
	public static void main(String args[]){
		Link l = new Link() ;
		l.addNode("A") ;		// 增加節點
		l.addNode("B") ;		// 增加節點
		l.addNode("C") ;		// 增加節點
		l.addNode("D") ;		// 增加節點
		l.addNode("E") ;		// 增加節點
		l.printNode() ;
	}
};


2、查找節點,依次遞歸的方式進行查找

class Link{		// 鏈表的完成類
	class Node{	// 保存每一個節點,此處為了方便直接定義成內部類
		private String data ;	// 保存節點的內容
		private Node next ;		// 保存下一個節點
		public Node(String data){
			this.data = data ;		// 通過構造方法設置節點內容
		}
		public void add(Node newNode){		// 將節點加入到合適的位置
			if(this.next==null){			// 如果下一個節點為空,則把新節點設置在next的位置上
				this.next = newNode ;
			}else{		// 如果不為空,則需要向下繼續找next
				this.next.add(newNode) ;
			}
		}
		public void print(){
			System.out.print(this.data + "\t") ;	// 輸出節點內容
			if(this.next!=null){		// 還有下一個元素,需要繼續輸出
				this.next.print() ;	// 下一個節點繼續調用print
			}
		}
		public boolean search(String data){	// 內部搜索的方法
			if(data.equals(this.data)){		// 判斷輸入的數據是否和當前節點的數據一致
				return true ;
			}else{	// 向下繼續判斷
				if(this.next!=null){	// 下一個節點如果存在,則繼續查找
					return this.next.search(data) ;	// 返回下一個的查詢結果
				}else{
					return false ;		// 如果所有的節點都查詢完之後,沒有內容相等,則返回false
				}
			}
		}
	};
	private Node root ;		// 鏈表中必然存在一個根節點
	public void addNode(String data){	// 增加節點
		Node newNode = new Node(data) ;	// 定義新的節點
		if(this.root==null){			// 沒有根節點
			this.root = newNode ;	// 將第一個節點設置成根節點
		}else{		// 不是根節點,放到最後一個節點之後
			this.root.add(newNode) ;	// 通過Node自動安排此節點放的位置
		}
	}
	public void printNode(){		// 輸出全部的鏈表內容
		if(this.root!=null){		// 如果根元素不為空
			this.root.print() ;	// 調用Node類中的輸出操作
		}
	}
	public boolean contains(String name){	// 判斷元素是否存在
		return this.root.search(name) ;	// 調用Node類中的查找方法
	}
};
public class LinkDemo02{
	public static void main(String args[]){
		Link l = new Link() ;
		l.addNode("A") ;		// 增加節點
		l.addNode("B") ;		// 增加節點
		l.addNode("C") ;		// 增加節點
		l.addNode("D") ;		// 增加節點
		l.addNode("E") ;		// 增加節點
		System.out.println(l.conteains("C"));
	}
};


3、刪除節點,改變引用傳遞的地址

class Link{		// 鏈表的完成類
	class Node{	// 保存每一個節點,此處為了方便直接定義成內部類
		private String data ;	// 保存節點的內容
		private Node next ;		// 保存下一個節點
		public Node(String data){
			this.data = data ;		// 通過構造方法設置節點內容
		}
		public void add(Node newNode){		// 將節點加入到合適的位置
			if(this.next==null){			// 如果下一個節點為空,則把新節點設置在next的位置上
				this.next = newNode ;
			}else{		// 如果不為空,則需要向下繼續找next
				this.next.add(newNode) ;
			}
		}
		public void print(){
			System.out.print(this.data + "\t") ;	// 輸出節點內容
			if(this.next!=null){		// 還有下一個元素,需要繼續輸出
				this.next.print() ;	// 下一個節點繼續調用print
			}
		}
		public boolean search(String data){	// 內部搜索的方法
			if(data.equals(this.data)){		// 判斷輸入的數據是否和當前節點的數據一致
				return true ;
			}else{	// 向下繼續判斷
				if(this.next!=null){	// 下一個節點如果存在,則繼續查找
					return this.next.search(data) ;	// 返回下一個的查詢結果
				}else{
					return false ;		// 如果所有的節點都查詢完之後,沒有內容相等,則返回false
				}
			}
		}
		public void delete(Node previous,String data){
			if(data.equals(this.data)){	// 找到了匹配的節點
				previous.next = this.next ;	// 空出當前的節點
			}else{
				if(this.next!=null){	// 還是存在下一個節點
					this.next.delete(this,data) ;	// 繼續查找
				}
			}
		}
	};
	private Node root ;		// 鏈表中必然存在一個根節點
	public void addNode(String data){	// 增加節點
		Node newNode = new Node(data) ;	// 定義新的節點
		if(this.root==null){			// 沒有根節點
			this.root = newNode ;	// 將第一個節點設置成根節點
		}else{		// 不是根節點,放到最後一個節點之後
			this.root.add(newNode) ;	// 通過Node自動安排此節點放的位置
		}
	}
	public void printNode(){		// 輸出全部的鏈表內容
		if(this.root!=null){		// 如果根元素不為空
			this.root.print() ;	// 調用Node類中的輸出操作
		}
	}
	public boolean contains(String name){	// 判斷元素是否存在
		return this.root.search(name) ;	// 調用Node類中的查找方法
	}
	public void deleteNode(String data){		// 刪除節點
		if(this.contains(data)){	// 判斷節點是否存在
			// 一定要判斷此元素現在是不是根元素相等的
			if(this.root.data.equals(data)){	// 內容是根節點
				this.root = this.root.next ;	// 修改根節點,將第一個節點設置成根節點
			}else{
				this.root.next.delete(root,data) ;	// 把下一個節點的前節點和數據一起傳入進去
			}
		}
	}
};
public class LinkDemo02{
	public static void main(String args[]){
		Link l = new Link() ;
		l.addNode("A") ;		// 增加節點
		l.addNode("B") ;		// 增加節點
		l.addNode("C") ;		// 增加節點
		l.addNode("D") ;		// 增加節點
		l.addNode("E") ;		// 增加節點
		System.out.println("======= 刪除之前 ========") ;
		l.printNode() ;
		// System.out.println(l.contains("X")) ;
		l.deleteNode("C") ;		// 刪除節點
		l.deleteNode("D") ;		// 刪除節點
		l.deleteNode("A") ;		// 刪除節點
		System.out.println("\n====== 刪除之後 =========") ;
		l.printNode() ;
		System.out.println("\n查詢節點:" + l.contains("B")) ;
	}
};


最後更新:2017-04-03 15:21:46

  上一篇:go sax錯誤:org.xml.sax.SAXParseException: Content is not allowed in prolog解決
  下一篇:go PHP XAMPP配置PHP環境和Apache80端口被占用解決方案