java中的单向链表和双向链表,双向循环链表java_2

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: