博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
双向循环链表
阅读量:3956 次
发布时间:2019-05-24

本文共 3712 字,大约阅读时间需要 12 分钟。

2021-05-09

学习视频:

思想:

为当前节点追加一个节点:

1,先找出该节点的下一个节点,存放起来;

2,将新结点设置为当前节点的下一个节点,将当前节点设置为新结点的上一个节点;

3,将步骤1的节点设置为新结点的下一个节点,将新结点设置为步骤1的节点的上一个节点;

1,当只有一个节点的时候,该节点的上一个节点、下一个节点,都指向它自己;

 

2,为当前节点-节点1,追加节点2:

①,先存储节点1的下一个节点,即还是节点1;

②,将节点2设置为节点1的下一个节点,将节点1设置为节点2的上一个节点;

③,将步骤①的节点(即还是节点1)设置为节点2的下一个节点,将节点2设置为步骤①的节点(即节点1)的上一个节点;

小结:此时,追加完成,节点1的下一个节点是节点2,节点1的上一个节点还是节点2,节点2的上一个节点是节点1,节点2的下一个节点还是节点1;

 

3,为当前节点-节点2,追加节点3:

①,存放起来当前节点节点2的下一个节点,即节点1;

②,将节点3设置为当前节点节点2的下一个节点,将当前节点节点2设置为节点3的上一个节点;

③,将步骤①的节点即节点1 设置为节点3的下一个节点,将节点3设置为步骤①的节点节点1的上一个节点;

小结:

此时,节点3追加完成;

节点1的下一个节点是节点2,节点2的下一个节点是节点3,节点3的下一个节点是节点1;

节点1的上一个节点是节点3,节点3的上一个节点是节点2,节点2的上一个节点是节点1;

 

4,再往后边继续追加节点也是一样,至此,一个双向循环链表组成;

 

代码:

package per.zhangyh.algorithm.data_structure.code;/** *@author:zhangyonghui; *@date: 2021/5/9; 16:32 *@Describe: 双向链表 */public class DoubbleNode {    private int data; /*节点数据*/    //当只有一个节点的时候,上一个节点与下一个节点都是本节点,所以=this;    private DoubbleNode preNode=this; //上一个节点    private DoubbleNode nextNode=this; //下一个节点    /*      追加一个新节点        前提:以前会判断是否有下一个节点,现在不用判断,因为是一个循环链表,所以一定有下一个节点;        1,取出现在情况下,该节点的下一个节点;        2,将新结点设置为该节点的下一个节点,将该节点设置为新结点的上一个节点;        3,将原来的下一个节点设置为该结点的下下一个节点,将该节点的现在的下一个节点设置为原来的下一个节点的上一个节点;    */    public void appendAfterNode(DoubbleNode newNode) {        //取出下一个节点:        DoubbleNode nextNode = this.getNextNode();        //将新结点设置为该节点的下一个节点:        this.setNextNode(newNode);        //将该节点设置为新结点的上一个节点:        this.getNextNode().setPreNode(this);        //将原来的下一个节点设置为该结点的下下一个节点:        this.getNextNode().setNextNode(nextNode);        //将该节点现在的下一个节点设置为原来的下一个节点的上一个节点:        this.getNextNode().getNextNode().setPreNode(this.getNextNode());    }    //get set 构造 方法:    public int getData() {        return data;    }    public void setData(int data) {        this.data = data;    }    public DoubbleNode getPreNode() {        return preNode;    }    public void setPreNode(DoubbleNode preNode) {        this.preNode = preNode;    }    public DoubbleNode getNextNode() {        return nextNode;    }    public void setNextNode(DoubbleNode nextNode) {        this.nextNode = nextNode;    }    public DoubbleNode(int data) {        this.data = data;    }}

测试:

package per.zhangyh.algorithm.data_structure.Test;import per.zhangyh.algorithm.data_structure.code.DoubbleNode;/** *@author:zhangyonghui; *@date: 2021/5/9; 17:22 *@Describe: 双循环链表测试 */public class DoubbleNodeTest {    public static void main(String[] args) {        //新建几个节点:        DoubbleNode node1 = new DoubbleNode(1);        DoubbleNode node2 = new DoubbleNode(2);        DoubbleNode node3 = new DoubbleNode(3);        DoubbleNode node4 = new DoubbleNode(4);        DoubbleNode node5 = new DoubbleNode(5);        //追加节点,形成双循环链表:        node1.appendAfterNode(node2);        node2.appendAfterNode(node3);        node3.appendAfterNode(node4);        node4.appendAfterNode(node5);        //node5.appendAfterNode(node1);        //查看双循环链表:        System.out.println("node1的下一个节点 = " + node1.getNextNode().getData());        System.out.println("node2的下一个节点 = " + node2.getNextNode().getData());        System.out.println("node3的下一个节点 = " + node3.getNextNode().getData());        System.out.println("node4的下一个节点 = " + node4.getNextNode().getData());        System.out.println("node5的下一个节点 = " + node5.getNextNode().getData());        System.out.println("------------------------");        System.out.println("node5的上一个节点= " + node5.getPreNode().getData());        System.out.println("node4的上一个节点= " + node4.getPreNode().getData());        System.out.println("node3的上一个节点= " + node3.getPreNode().getData());        System.out.println("node2的上一个节点= " + node2.getPreNode().getData());        System.out.println("node1的上一个节点= " + node1.getPreNode().getData());    }}

测试结果:

 

 

 

 

 

 

 

 

转载地址:http://oytzi.baihongyu.com/

你可能感兴趣的文章
有序链表的合并(数据结构---单链表)
查看>>
栈实现(数据结构---数组,链表 C实现)
查看>>
POJ3903(dp,最长上升子序列,最基础题)
查看>>
POJ1836-Alignment(最长上升子序列)
查看>>
POJ1062昂贵的聘礼(Dijkstra+限制)
查看>>
POJ 2485 Highways(最小生成树,基础模板题)
查看>>
POJ 1251 Jungle Roads(最小生成树简单题)
查看>>
Floyd算法---模板
查看>>
HDU 1690---Bus System(Floyd模板题+合理定义INF)
查看>>
POJ3660---Cow Contest(Floyd,传递闭包,连通)
查看>>
POJ 2240---Arbitrage(Floyd的dp思想)
查看>>
Dijkstra算法---模板
查看>>
拓扑排序
查看>>
POJ 3680(费用流)
查看>>
校oj10532: 生成字符串(dp,最优状态转移)
查看>>
平衡二叉树(AVL树)
查看>>
优先队列---二叉堆
查看>>
POJ1521---哈夫曼编码,求最优WPL
查看>>
POJ---2010(Moo University - Financial Aid,优先队列)
查看>>
POJ---3662(Telephone Lines,最短路+二分*好题)
查看>>