java中的单向链表和双向链表,双向循环链表java
本文分享Java实现双向链表的具体代码,供大家参考。具体内容如下
00-1010 1.单向链表只能单向查找,双向链表可以向前或向后查找。2.单向链表不能自己删除,需要依靠辅助节点* *(也就是你需要找到要删除的节点的前一个节点,双向链表只需要找到要删除的节点)* *。双向链表可以自己删除。
双向链表与单链表的对比:
分析(代码实现原理):临时节点是辅助节点(因为头节点是固定的)。1.遍历:方式和单链表一样,但是是双向的,可以前进。你也可以倒推2。Add(默认到后面)(1)先找到链表的最后一个节点(2)temp . next=new node(3)new node . pre=tem 3。修改:思路和原理与单链表一致。4.删除:(1)因为是双链表,所以可以自己删除节点。(2)找到要删除的节点,假设这个节点
添加节点(按顺序):
00-1010 (1)查找上一个节点(temp)(2)node . next=temp . next(3)temp . next . pre=node(4)temp . next=node(5)node . pre=temp
代码实现:
类双向链表{//创建头节点。表示链表的头,私有节点头=新节点(0,, );//返回头节点publicnedgehead(){ Return head;} //AddNode1:在单个链表的末尾添加一个节点。//思路:在不考虑节点顺序//1的情况下,找到链表中的最后一个节点//2,将最后一个节点的Next指向新节点public void add Node 1(nodenode){//因为头节点不能移动,所以需要一个辅助节点来遍历节点temp=HeadWhile(true) {//查找链表的最后一个节点if(temp . next==null){ break;}//否则temp=temp temp=temp.next的下一个节点;}//循环出来后,temp是最后一个节点temp.next=nodenode.pre=temp}//addnode23360添加节点,按顺序,public void Add Node 2(nodenode){//因为头节点不能移动,所以需要一个辅助节点来遍历,找到新节点添加的位置,Node temp=Head布尔标志=假;//order用于标识新节点是否已经存在于链表中while(true) {//如果此节点是最后一个节点,则新节点添加到最后一个位置If(temp . next==null){ break;} else if(temp . next . number node . number){//说明添加新节点的位置已经找到break} else if(temp . next . number==node . number){//表示链表中已经存在新节点的顺序。flag=true} temp=temp.next} if(flag) {System.out.println(该节点的顺序已经存在,插入失败);}else {//表示新节点不存在于链表中。插入新节点。//新节点的下一个节点=二级节点的下一个节点. next=temp . next;if(temp.next!=null) {//如果temp的下一个节点不为空,则temp的下一个节点的上一个节点为新节点temp . next . pre=node;}//次节点的下一个节点=新节点temp.next=node
//新节点的前一个节点为辅助节点 node.pre=temp; } } //删除节点 public void remove(Node node) { if(Head.next==null) { System.out.println("链表为空!"); return; } //创建辅助节点 Node temp=Head.next; boolean flag=false; //标识是否找到了要删除的节点 while(true) { if(temp==null) { //遍历完链表了 break; }else if(temp.number==node.number) { //找到要删除的节点了 flag=true; break; } temp=temp.next; } if(flag) { //链表中存在要删除的节点 temp.pre.next=temp.next; //令temp的前一个节点的下一个节点为temp的后一个节点 if(temp.next!=null) { //如果temp不为最后一个节点的话 temp.next.pre=temp.pre; //令temp的下一个节点的前一个节点为temp的前一个节点 } }else { System.out.printf("不存在编号为%d的节点",node.number); } } //修改节点,按照节点的Number来修改 public void update(Node newNode) { if(Head.next==null) { System.out.println("链表为空!"); return; } //创建辅助节点,对链表遍历,知道找到等于修改节点的number的时候 Node temp=Head.next; boolean flag=false; //用来标识是否找到了修改节点的Number while(true) { if(temp==null) { //则已经遍历完链表 break; } if(temp.number==newNode.number) { flag=true; break; } temp=temp.next; } if(flag) { temp.name=newNode.name; temp.nickName=newNode.nickName; }else { System.out.printf("没有找到编号为%d的节点",newNode.number); } } //展示链表 public void show() { if(Head.next==null) { System.out.println("链表为空!"); return; } //因为头节点不能动,所以通过辅助节点遍历链表 Node temp=Head.next; while(true) { //判断是不是最后一个节点 if(temp.next==null) { System.out.println(temp); break; } System.out.println(temp); //temp指向下一个节点 temp=temp.next; } }}//创建节点class Node{ public int number; public String name; public String nickName; public Node next; //指向下一个节点 public Node pre;//指向前一个节点 //构造器 public Node(int number,String name,String nickName) { this.number=number; this.name=name; this.nickName=nickName; } @Override public String toString() { return "Node [number=" + number + ", name=" + name + ", nickName=" + nickName + "]"; }}测试代码:
public static void main(String[] args) { // TODO 自动生成的方法存根 Node node1=new Node(1,"宋江","及时雨"); Node node2=new Node(2,"卢俊义","玉麒麟"); Node node3=new Node(3,"吴用","智多星"); Node node4=new Node(4,"林冲","豹子头"); Node node5=new Node(4,"linchong","豹子头"); //创建一个链表 DoubleLinkedList linkedList=new DoubleLinkedList(); linkedList.AddNode2(node1); linkedList.AddNode2(node3); linkedList.AddNode2(node4); linkedList.AddNode2(node2); linkedList.show(); System.out.println("------------"); linkedList.remove(node4); linkedList.show(); }
结果:
Node [number=1, name=宋江, nickName=及时雨]Node [number=2, name=卢俊义, nickName=玉麒麟]Node [number=3, name=吴用, nickName=智多星]Node [number=4, name=林冲, nickName=豹子头]————————————————————————Node [number=1, name=宋江, nickName=及时雨]Node [number=2, name=卢俊义, nickName=玉麒麟]Node [number=3, name=吴用, nickName=智多星]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。