Java双向链表的实现-- 数据结构的学习

双向链表

package algorithm.linkedlist;

public class DoubleLinkedListDemo {

	public static void main(String[] args) {
		
		DoubleLinkedList list = new DoubleLinkedList();
		BeanNode n1 = new BeanNode(1, "111");
		BeanNode n2 = new BeanNode(2, "222");
		BeanNode n3 = new BeanNode(3, "333");
		BeanNode n4 = new BeanNode(4, "444");
		BeanNode n5 = new BeanNode(5, "555");
		BeanNode n6 = new BeanNode(6, "666");
		
		//添加节点
//		list.add(n1);
//		list.add(n2);
//		list.add(n3);
//		list.add(n4);
//		list.add(n5);
//		list.add(n6);
//		list.show();
		//添加节点(有序)
		list.addByOrder(n2);
		list.addByOrder(n1);
		list.addByOrder(n3);
		list.addByOrder(n5);
		list.addByOrder(n6);
		list.addByOrder(n4);
		//list.show();
		
		//删除
//		list.deleteNode(1);
//		list.deleteNode(6);
//		list.deleteNode(3);
//		list.deleteNode(23);
		list.show();
		
		//修改
		list.update(new BeanNode(6, "老王"));
		list.show();
		
		//查找
		BeanNode node = list.findByValue(5);
		System.out.println("node = "+node);
		BeanNode node2 = list.findByValue(51);
		System.out.println("node2 = "+node2);
		
	}
	
	
	
}
/**
 * 双向链表
 * @author lenovo
 *
 */
class DoubleLinkedList{
	
	//头结点
	BeanNode head = new BeanNode(0, "头结点");

	public BeanNode getHead() {
		return head;
	}

	public void setHead(BeanNode head) {
		this.head = head;
	}
	
	//打印链表数据
	public void show() {
		
		if (head.next == null) {
			System.out.println("show空链表");
			return;
		}
		BeanNode temp = head.next;
		while(temp != null) {
			System.out.println(temp);
			temp = temp.next;
		}
	}	
	//添加(末尾)
	public void add(BeanNode node) {
		//临时指针
		BeanNode temp = head;
		while(true) {
			if(temp.next == null) {//遍历到末尾
				break;
			}
			temp = temp.next;
		}
		//双向链表添加
		temp.next = node;
		node.pre = temp;
	}
	//添加(有序)
	public void addByOrder(BeanNode node) {
		
		BeanNode temp = head;
		boolean flag = false;//是否存在添加的节点
		while(true) {
			if(temp.next == null) {//链尾
				break;
			}
			if(temp.next.value > node.value) {
				break;
			}
			if(temp.next.value == node.value) {
				flag = true;
				break;
			}
			temp =temp.next;
		}
		if(flag) {
			System.out.println("已存在");
		}else {
			//双向链表节点指向
			node.next = temp.next;
			node.pre = temp;
			//注意,若是添加到末尾时temp.next = null 空指针异常
			if(temp.next != null) {
				temp.next.pre = node;
			}
			//顺序不能变,这个必须在最后
			temp.next = node;
		}
		
	}
	//删除节点
	public void deleteNode(int val) {
		
		if (head.next == null) {
			System.out.println("del空链表");
			return;
		}
		boolean flag = false;//是否找到
		BeanNode temp = head.next;//撒双向链表可以自删除,不需要像单链表那样借助删除节点的前一个节点
		while(true) {
			if (temp == null) {//链尾
				break;
			}
			if(temp.value == val) {
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if (flag) {
			temp.pre.next = temp.next;
			//注意使用temp.next,易造成空指针(最后一个节点)
			if (temp.next != null) {
				temp.next.pre = temp.pre;
			}else {
				temp.pre = null;
			}
			
		}else {
			System.out.println("未找到节点");
		}
		
	}
	//修改
	public void update(BeanNode node) {
		if (head.next == null) {
			System.out.println("update空链表");
			return;
		}
		boolean flag = false;
		BeanNode temp = head.next;
		while(true) {
			if (temp == null) {
				break;
			}
			if (temp.value == node.value) {
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if (flag) {
			temp.name = node.name;
		}else {
			System.out.println("update未找到");
		}
		
	}
	public BeanNode findByValue(int val) {
		if (head.next == null) {
			System.out.println("空链表");
			return null;
		}
		BeanNode temp = head.next;
		while(temp != null) {//遍历到链尾结束
			if (temp.value == val) {
				break;
			}
			temp = temp.next;
		}
		return temp;//找到就返回找到的节点,没找到就返回null
	}
	
}

class BeanNode{
	
	int value;
	String name;
	BeanNode next;
	BeanNode pre;
	public BeanNode(int value,String name) {
		this.value = value;
		this.name = name;
	}
	@Override
	public String toString() {
		return "BeanNode [value=" + value + ", name=" + name + "]";
	}
	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值