對鏈表的 操作

package com.test;
/*
 * 1、鏈表類
 * 2、一個構造方法,一個顯示方法
 * */
public class Link {
	public int iData;
	public Link next;
	public Link previous;
	public Link(int id){
		iData = id;
	}
	public void displayLink(){
		System.out.println(iData+"---");
	}
}

雙向鏈表:

package com.test;

/*
 * 雙向鏈表
 * 
 *  3=current.pre   4=current  5=current.next
 * *****************************
 * | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
 * *****************************
 * */
public class DoublyLinkedList {
	private Link firstLink;
	private Link lastLink;
	
	public DoublyLinkedList(){
		firstLink = null;
		lastLink = null;
	}
	public boolean isEmpty(){
		return firstLink == null ;
	}
	public void insertFirst(int id){
		Link newLink = new Link(id);
		if(isEmpty()){					
			lastLink =newLink;			//若if成立 則必須給lastLink 賦值
		}else{							
			firstLink.previous = newLink;		//讓第一個連接點的前一個連接點 等於 新的連接點
			newLink.next = firstLink;			//讓新的連接點的下一個連接點 等於 第一個連接點			
		}
		firstLink = newLink;			//給第一個連接點賦值
	}
	public void insertLast(int id){
		Link newLink = new Link(id);
		if(isEmpty()){
			firstLink = newLink;		//若鏈表爲空則讓新的連接點 等於 第一個連接點等於
		}else{			
			lastLink.next = newLink;
			newLink.previous = lastLink;	
		}
		lastLink = newLink;
	}
	//在當前節點後面插入新的連接點
	public boolean insertAfter(int key,int id){
		Link current = firstLink;
		while (current.iData != key) {      //循環鏈表 當current = key時跳出循環
			current = current.next;
			if(current == null){
				return false;
			}
		}
		Link newLink = new Link(id);
		if(current == lastLink){			//當current = lastLink時
			newLink.next = null;
			lastLink = newLink;
		}else{								//否則
			newLink.next = current.next;	//新連接點的下一個 指向 當前連接點的下一個 
			current.next.previous = newLink;//當前連接點的前一個連接點 等於 新的連接點
		}
		newLink.previous = current;			//新的連接點的前一個連接點 等於 當前連接點
		current.next = newLink;				//當前連接點的下一個 等於 新的連接點
		return true;		
	}
	public Link deleteFirst(){
		Link tempLink = firstLink;
		if(firstLink.next == null){
			lastLink = null;
		}else{
			firstLink.next.previous = null;
			firstLink = firstLink.next;
		}	
		return tempLink;
	}	
	public Link deleteLast(){
		Link tempLink = lastLink;
		if(lastLink.previous == null){
			firstLink = null;
		}else{
			lastLink.previous.next = null;
			lastLink = lastLink.previous;
		}
		return tempLink;
	}
	public Link deleteKey(int key){
		Link current = firstLink;
		while (current.iData!=key) {
			current = current.next;
			if(current == null){
				return null;
			}
		}
		if(current == firstLink){			//當刪除的等第一個連接點是
			firstLink = current.next;
		}else{
			current.previous.next = current.next; //被刪除節點的前一個連接點指向被刪除連接點的後一個連接點
		}
		if(current == lastLink){
			lastLink = current.previous;
		}else{
			current.next.previous = current.previous;//被刪除節點的下一個連接點節點指向被刪除節點的前一個連接點
		}
		return current;
	}
	public void displayForward(){
		System.out.println("List---(first--->last)");
		Link currentLink = firstLink;
		while(currentLink != null) {
			currentLink.displayLink();
			currentLink = currentLink.next;		
		}		
	}
	public void displayBackward(){
		System.out.println("List---(last--->first)");
		Link currentLink = lastLink;
		while (currentLink != null) {
			currentLink.displayLink();
			currentLink = currentLink.previous;
		}
	}
	public static void main(String[] args) {
		DoublyLinkedList list = new DoublyLinkedList();
		list.insertFirst(1);
		list.insertFirst(2);
		list.insertFirst(3);
		list.insertLast(4);
		list.insertLast(5);
		list.insertLast(6);
		list.displayForward();
		list.displayBackward();
		list.insertAfter(1, 7);
		list.displayForward();
		Link linkFirstLink = list.deleteFirst();  //在刪除的時候應該先判斷鏈表是否爲空,此處省略
		System.out.println("deleteFirst--->"+linkFirstLink.iData);
		Link linkLastLink = list.deleteLast();
		System.out.println("deleteLast---->"+linkLastLink.iData);
		Link linkDeleteKey = list.deleteKey(1);
		System.out.println("delteKey------>"+linkDeleteKey.iData);
		

	}	
}

雙端鏈表:

package com.test;
/*
 * 雙端鏈表
 * 1、刪除不掉最後一個連接點
 * */
public class FirstLastList {
	public Link first;
	public Link last;
	public FirstLastList(){
		first = null;
		last = null;
	}
	public boolean isEmpty(){
		return first == null;		
	}
	public void insertFirst(int id){
		Link newLink = new Link(id);
		if(isEmpty()){
			last = newLink;		////若Link 爲空 則insertFirst 將last指向新的連接點
		}
		newLink.next = first;
		first = newLink;		// 將新插入的值賦給鏈表中的第一個數
	}
	public void insertLast(int id){
		Link newLink = new Link(id);
		if(isEmpty()){
			first = newLink;	//若Link 爲空 則insertLast 將first指向新的連接點
		}else{
			last.next = newLink;
		}
		last = newLink;			//將新插入的值賦給鏈表中最後一個數
	}
	//插入排序
	public void insert(Link k){
		Link previous = null;	//從表頭開始
		Link current = first;
		while (current!=null && k.iData < current.iData ) {
			previous = current;			
			current = current.next;
			
		}
		if(previous == null){	//如果要插入的數在表頭
			first = k;
		}else{					//如果要插入的數不在表頭
			previous.next = k;
		}
		k.next = current;
	}
	public Link deleteLink(){
		Link temp = first;
		if(first.next!=null){
			last = null;
		}
		first.next = first;
		return temp;
	}
	public void display(){
		System.out.println("list :(first ---> last)");
		Link current = first;
		while (current != null) {
			current.displayLink();
			current = current.next;
		}
	}
	public static void main(String[] args) {
		FirstLastList fll = new FirstLastList();
		fll.insertFirst(1);
		//fll.insertFirst(2);
		fll.insertFirst(3);
		
		fll.insertLast(55);
		fll.insertLast(77);
		Link k = new Link(2);
		fll.insert(k);
		//fll.deleteLink();   //刪除不掉最後一個
		fll.display();
		//fll.deleteLink();
		
	}
}

鏈表的增刪查改

package com.test;

/*
 * 1、鏈表的插入、刪除
 * 2、查找鏈表中指定的連接點
 * 3、刪除鏈表中指定的連接點
 * 
 * */

public class LinkList {
	private Link  firstLink;   //鏈表中第一個數
	public LinkList(){
		firstLink = null;
	}
	public boolean isEmpty(){
		return (firstLink==null);
	} 
	public void insertFirst(int id){
		Link newLink = new Link(id);
		newLink.next = firstLink;	// 讓新創建的連接點的next指向原來(第一個)的連接點
		firstLink = newLink;		// 改變原來firstLink的值,讓他指向新的連接點	
	}
	public Link deleteFirst(){
		Link  temp = firstLink;    //在刪除之前將鏈表中第一個存在temp中,然後刪除firstLink(假設有刪除操作)
		firstLink = firstLink.next;//將firstLink指向原來firstLink的下一個(next)
		return temp;			   //返回刪除後的這個數
	}
	public void displayList(){
		Link current = firstLink;
		while (current != null) {
			current.displayLink();
			current = current.next;					
		}
	}
	/*
	 * currentLink 的變量開始指向第一個連接點(即,firstLink)
	 * 然後通過不斷的把自身的值賦值給 currentLink.next,沿着鏈表向前移動
	 * 檢查每個連接點的key 是否與 參數(id)相等
	 * 若找到匹配的,則返回此連接點的引用,否則返回 null
	 * */
	public Link find(int id){
		Link currentLink = firstLink;		//保存第一個連接點(即 currentLink 引用第一個練級點)
		while (currentLink.iData!= id) {	//若連接點的key 與參數是否相等
			if(currentLink.next == null){	//若連接點的的下一個爲空
				return null;
			}else{
				currentLink = currentLink.next;	//否則讓此連接點等於下一個連接點,繼續循環			
			}		
		}
		return currentLink;
	}
	public Link deleteLink(int id){
		Link beforLink = firstLink;   //被刪除數的前一個數
		Link tempLink = firstLink;	  //被刪除的數
		while (tempLink.iData!=id) {
			if(tempLink == null){
				return null;
			}else{
				beforLink = tempLink;			//beforLink 始終等於 被刪除數(tempLink) 的前一個數
				tempLink = tempLink.next;				
			}
		}
		if(tempLink == firstLink){			//若 被刪除數(tempLink) 爲 鏈表中的第一個數,則讓firstLink 等於他的下一個
			firstLink = firstLink.next;
		}else{
			beforLink.next = tempLink.next;  //否則 讓被刪除數(tempLink) 的後一個數等於 被刪除數的位置 (即beforLink.next) 
		}
		return tempLink;
	}
	public static void main(String[] args) {
		LinkList theLinkList = new LinkList();
		theLinkList.insertFirst(1);
		theLinkList.insertFirst(2);
		theLinkList.insertFirst(3);
		theLinkList.displayList();
		//循環刪除 鏈表裏面的值
		while (!theLinkList.isEmpty()) {
			Link aLink = theLinkList.deleteFirst();
			System.out.println("Delete");
			aLink.displayLink();			
		}		
		theLinkList.displayList();
		//找到指定的連接點
		Link  find = theLinkList.find(2);
		if(find!=null){
			System.out.println("find link with key--->"+find.iData);
		}else{
			System.out.println("can't find "+find.iData);
		}
		//刪除指定的連接點
		Link delet = theLinkList.deleteLink(2);
		if(delet!=null){
			System.out.println("delete link with key--->"+find.iData);
		}else{
			System.out.println("can't find "+find.iData);
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章