Java數據結構(5)----雙向鏈表

雙向鏈表

雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向直接後繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點

雙向鏈表比單鏈表多了一個前驅這裏我們直接上代碼

代碼實現

//雙向鏈表
public class TwoWayLinkListTest {
	public static void main(String[] args) {
		TWLinkNode linkNode1 = new TWLinkNode(1);
		TWLinkNode linkNode2 = new TWLinkNode(2);
		TWLinkNode linkNode3 = new TWLinkNode(3);
		TWLinkNode linkNode4 = new TWLinkNode(4);
		TwoWayLinkList twoWayLinkList = new TwoWayLinkList();
		twoWayLinkList.insert(linkNode1);
		twoWayLinkList.insert(linkNode2);
		twoWayLinkList.insert(linkNode3);
		twoWayLinkList.insert(linkNode4);
		System.out.println("插入數據後遍歷");
		twoWayLinkList.showLink();
		System.out.println("雙向鏈表長度爲:"+twoWayLinkList.LinkListLength());
		//修改位置爲2的節點
		twoWayLinkList.update(2, 6);
		System.out.println("修改位置爲2的節點讓他的值爲6數據後遍歷");
		twoWayLinkList.showLink();
		
		
		System.out.println("修改位置爲6的節點讓他的值爲6數據後遍歷");
		twoWayLinkList.update(6, 6);
		twoWayLinkList.showLink();
		//查找位置爲2的節點
		System.out.println("查找數據後返回");
		twoWayLinkList.select(4);
		
		System.out.println("開始刪除 刪除節點5:");
		twoWayLinkList.delete(5);
		twoWayLinkList.showLink();
		
		System.out.println("開始刪除 刪除節點3:");
		twoWayLinkList.delete(3);
		twoWayLinkList.showLink();
		//twoWayLinkList.showLink();
		System.out.println("雙向鏈表長度爲:"+twoWayLinkList.LinkListLength());
		
		System.out.println("開始反轉鏈表");
		
		
		
		showLink(reserveLink(twoWayLinkList.getHead()));
		
		
		//反轉雙向鏈表
		
	}
	public static TWLinkNode reserveLink(TWLinkNode head){
//		if(head.next==null) {
//			System.out.println("雙向鏈表爲空");
//		}
		TWLinkNode q = null;
		TWLinkNode p = null;

        while(true) {
                p = head.next;
                head.next = q;
                head.pre = p;
                q = head;
                head = p;
                if (head==null) {
					break;
				}
        }
        return q;
		
	}		
	public static void showLink(TWLinkNode head) {
		//定義一個輔助變量進行遍歷
		if(head.next==null) {
			System.out.println("雙向鏈表爲空");
			return;
		}
		TWLinkNode temp = head;
		while(true) {
			if(temp.next==null) {
				break;
			}
			System.out.println(temp.data);
			temp = temp.next;
			
		}
	}
}

class TWLinkNode{
	public int data;
	public TWLinkNode next;
	public TWLinkNode pre;

	
	@Override
	public String toString() {
		return "LinkNode [data=" + data + "]";
	}
	
	public TWLinkNode(int data) {
		this.data = data;
	}
}
class TwoWayLinkList{
	private TWLinkNode head = new TWLinkNode(0);
	
	//遍歷
	public void showLink() {
		//定義一個輔助變量進行遍歷
		if(head.next==null) {
			System.out.println("雙向鏈表爲空");
			return;
		}
		TWLinkNode temp = head.next;
		while(true) {
			if(temp==null) {
				break;
			}
			System.out.println(temp.data);
			temp = temp.next;
			
		}
	}
	//插入
	public void insert(TWLinkNode node) {
		TWLinkNode temp = head;
		while (true) {
			if (temp.next == null) {
				break;
			}
			temp = temp.next;
		}
		temp.next = node;
		node.pre = temp;
	}
	
	//查找
	public void select(int index) {
		if(head.next==null) {
			System.out.println("雙向鏈表爲空");
			return;
		}
		if (index>LinkListLength() || index<=0) {
			System.out.println("超過雙向鏈表範圍,無法修改");
			return;
		}
		TWLinkNode temp = head.next;
		boolean flag = true;
		//創造一個計數器
		int count = 1;
		while(flag) {		
			if (index == count) {
				flag = false;
				break;
			}
			count++;
			temp = temp.next;
			
		}
		System.out.println(temp.data);
	}
	
	//修改
	public void update(int index,int value) {
		if(head.next==null) {
			System.out.println("雙向鏈表爲空");
			return;
		}
		if (index>LinkListLength() || index<=0) {
			System.out.println("超過雙向鏈表範圍");
			return;
		}
		TWLinkNode temp = head;
		
		for (int i = 1; i <=LinkListLength(); i++) {
			temp = temp.next;
			if(i==index) {
				temp.data = value;
				break;
			}
			if(temp.next==null) {
				System.out.println("未找到目標位置");
			}
		}
	}
	
	//刪除
	public void delete(int index) {
		if(head.next == null) {
			System.out.println("單鏈表爲空");
			return;
		}
		if (index>LinkListLength() || index<=0) {
			System.out.println("刪除的節點超過雙向鏈表範圍");
			return;
		}
		TWLinkNode temp = head;
		for (int i = 1; i <=LinkListLength(); i++) {
			temp = temp.next;
			if(i == index) {
				temp.pre.next = temp.next;
				if (temp.next != null) {
					temp.next.pre = temp.pre;
				}
				break;
			}
		}
	}
	//得到雙向鏈表長度
	public int LinkListLength() {
		if(head.next==null) {
			System.out.println("雙向鏈表爲空");
			return 0;
		}
		TWLinkNode temp = head;
		int count = 0;
		while (true) {
			if(temp.next == null) {
				//System.out.println();
				break;				
			}
			temp = temp.next;
			count++;
		}
		return count;
	}
	
	public TWLinkNode getHead() {
		return head;
	}
	
}

有問題的話,我們可以一起交流,一起進步

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