java doubly linked list

java doubly linked list


A doubly linked list means that each node not only has a next attribute pointing to the next node, but also a pre attribute pointing to the previous node . In this case, in the modified code, only the addition of the node class attributes of a pre , in the method of class list, if the node to make additions and deletions , so that the position prior to the pre attribute points to the node of a node.

Different from a singly linked list, when deleting a node in a doubly linked list, you can directly use tmp to point to the node to be deleted without using tmp to point to the previous position of the node to be deleted.

The overall code is as follows

package linkedlist;

public class DoubleLinkedListDemo {
    
    
	public static void main(String[] args) {
    
    
		HeroNode2 hero1 = new HeroNode2(1,"宋江","及时雨");
		HeroNode2 hero2 = new HeroNode2(2,"卢俊义","玉麒麟");
		HeroNode2 hero3 = new HeroNode2(3,"吴用","智多星");
		HeroNode2 hero4 = new HeroNode2(4,"林冲","豹子头");
		
		DoubleLinkedList test = new DoubleLinkedList();
//		test.addNode(hero1);
//		test.addNode(hero2);
//		test.addNode(hero4);
//		test.addNode(hero3);
		
		test.addNodeByOrder(hero3);
		test.addNodeByOrder(hero2);
		test.addNodeByOrder(hero1);
		test.addNodeByOrder(hero4);
		
		HeroNode2 newHero = new HeroNode2(2,"小卢","小玉");
		test.modifyNode(newHero);
		
		test.showList();
		
		test.delNode(2);
		
		test.showList();
		
		test.delNode(4);
		
		test.showList();
	}
}

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

class DoubleLinkedList{
    
    
	HeroNode2 head = new HeroNode2(0,"","");
	
	public void addNode(HeroNode2 node){
    
    
		HeroNode2 tmp = head;
		while(true){
    
    
			if(tmp.next == null)
			{
    
    
				tmp.next = node;
				node.pre = tmp;
				break;
			}
			tmp = tmp.next;
		}
	}
	
	
	public void addNodeByOrder(HeroNode2 node){
    
    
		HeroNode2 tmp = head;
		boolean flag = false;
		while(true){
    
    
			if(tmp.next == null){
    
    
				break;
			}else if(tmp.next.no > node.no){
    
    
				
				break;
			}else if(tmp.next.no == node.no )
			{
    
    
				flag = true;
				break;
			}
			tmp = tmp.next;
		}
		if(flag == true)
		{
    
    
			System.out.printf("输入的编号%d已存在",node.no);
			System.out.println();
		}
		
		else{
    
    
			node.next = tmp.next; //是tmp.next给node.next,不要记成了tmp.next.next,单链表的中delNode才这么用,别记混了。null是没有.next 属性的
			tmp.next = node;
			node.pre = tmp;
			if(tmp.next.next != null)
			tmp.next.next.pre = node;
		}
	}
	
	//tmp按顺序添加的时候,tmp还是只能执行要插入元素的前一个值,不能为要插入元素的后一个值,因为如果tmp为null,就无法定位tmp前一个元素了
//	public void addNodeByOrder(HeroNode2 node){
    
    
//		HeroNode2 tmp = head.next;
//		boolean flag = false;
//		while(true){
    
    
//			if(tmp == null)
//				break;
//			if(tmp.no == node.no){
    
    
//				flag = true;
//				break;
//			}
//			if(tmp.no > node.no){
    
    
//				break;
//			}
//			tmp = tmp.next;
//		}
//		if(flag){
    
    
//			System.out.println("节点已存在,不可重复添加");
//			
//		}
//		else{
    
    
//			if (tmp != null) {
    
    
//				tmp = node.next;
//				tmp.pre.next = node;
//			}
//			else{
    
    
//				tmp = node; //如果tmp为null,则无法定位到tmp前面的对象,故此方法不行
//			}
//		}
//	}
	
	public void modifyNode(HeroNode2 node){
    
    
		HeroNode2 tmp = head;
		if(tmp.next == null)
		{
    
    
			System.out.println("列表为空");
			return;
		}
		while(true){
    
    
			if(tmp.next == null){
    
    
				System.out.println("没有找到要修改的节点");
				break;
			}
			if(tmp.next.no == node.no){
    
    
				tmp.next.name = node.name;
				tmp.next.nickname = node.nickname;
				System.out.println("已找到要修改的节点,修改节点成功");
				break;
			}
			tmp = tmp.next;
		}
	}
	
	//删除节点的时候,也可以使用tmp指向待删除节点前一个位置的方法
//	public void delNode(int no){
    
    
//		HeroNode2 tmp = head;
//		if(tmp.next == null)
//		{
    
    
//			System.out.println("链表为空");
//			return;
//		}
//		while(true){
    
    
//			if(tmp.next == null){
    
    
//				System.out.println("没有找到要删除的节点");
//				break;
//			}
//			if(tmp.next.no == no){
    
    
//				tmp.next = tmp.next.next;
				System.out.println(tmp.next.next);
//				if(tmp.next != null)  //这儿千万不能写成tmp.next.next,因为上一条语句的关系,否则null.pre或者null.next会有空指针的异常。
//				{
    
    
//					tmp.next.pre = tmp;
					
//				}
//				System.out.println("删除节点成功");
//				break;
//			}
//			tmp = tmp.next;
//		}
//	}
	
	//使用双向链表作删除节点的时候,可以不用向单向链表那样把tmp定位到目标节点的前一个位置,直接把tmp定位到目标节点即可。
	public void delNode(int n){
    
    
		HeroNode2 tmp = head.next;
		if(tmp == null){
    
    
			System.out.println("链表为空");
		}
		while(true)
		{
    
    
			if(tmp == null){
    
    
				System.out.println("没有找到要删除的元素");
				break;
			}
			if(tmp.no == n){
    
    
				tmp.pre.next =  tmp.next;
				if(tmp.next != null)
					tmp.next.pre = tmp.pre;
				System.out.println("删除节点成功");
				break;
			}
			tmp = tmp.next;
		}
	}
	
	public void showList(){
    
    
		HeroNode2 tmp;
		if(head.next == null)
		{
    
    
			System.out.println("列表是空的");
			return;
		}
		tmp = head;
		tmp = tmp.next;
		while(true){
    
    
			if(tmp.next == null)
			{
    
    
				System.out.println(tmp);
				break;
			}
			System.out.println(tmp);
			tmp = tmp.next;
		}
	}
}

operation result

The node to be modified has been found. The modification of the node is successful.
HeroNode [no=1, name=
宋江, nickname=时光雨] HeroNode [no=2, name=小卢, nickname=
小玉] HeroNode [no=3, name=吴用, nickname=智多星]
HeroNode [no=4, name=林 Chong, nickname=豹子头]
Successfully deleted the node
HeroNode [no=1, name=
宋江, nickname=Timely rain] HeroNode [no=3, name=Wu Yong, nickname=智多星]
HeroNode [no=4, name=Lin Chong, nickname=豹子头]
Successfully deleted the node
HeroNode [no=1, name=Song Jiang, nickname=Timely Rain]
HeroNode [no=3, name=Wu Yong, nickname=智多星]

Guess you like

Origin blog.csdn.net/Meloneating/article/details/115283702