双向链表实例

package com.wyl.linklist;

/**
 * 双向链表,实现26个字母的循环输出
 * @author wyl
 *
 */
public class MyBinaryLink {

    private Node head; //定义双线链表的头结点
    /**
     * 定义双向链表的节点类
     */
    class Node{
        private char data; //节点的值
        private Node prior; //前驱节点
        private Node next; //后继节点
        public Node() {
        }
        public Node(char data) {
            this(data, null, null);
        }
        public Node(char data, Node prior, Node next) {
            this.data = data;
            this.prior = prior;
            this.next = next;
        }
        public char getData() {
            return data;
        }
        public void setData(char data) {
            this.data = data;
        }
        public Node getPrior() {
            return prior;
        }
        public void setPrior(Node prior) {
            this.prior = prior;
        }
        public Node getNext() {
            return next;
        }
        public void setNext(Node next) {
            this.next = next;
        }
    }
    /**
     * 构造函数初始化双向链表
     */
    public MyBinaryLink(){
        head = new Node(‘A‘, null, null);
        Node p = head;
        int i=1;
        for(;i<26;i++){
            if(p.next == null){
                char data = (char) (‘A‘ + i);
                Node newNode = new Node(data, p, null);
                p.next = newNode;
                p = p.next;
            }
        }
        p.next = head;
        head.prior = p;
    }
    /**
     * 打印双向链表的值
     */
    public void print(){
        Node p = head;
        while(p.next != head){
            System.out.print(p.data + "、");
            p = p.next;
        }
        System.out.print(p.data);
    }

    /**
     * 从链表的某个位置开始打印
     * @param num 表示从链表的第几个位置开始打印
     */
    public void printFrom(int num){
        int i = 1;
        Node p = head;
        Node rear = head.prior; //找到链表的尾节点
        Node start ;
        if(num > 0){
            for(;i<num;i++){
                p = p.next;
            }
            start = p;
            while(p.next != start){
                System.out.print(p.data);
                p = p.next;
            }
            System.out.print(p.data);
        }else{
            for(;i<-num;i++){
                rear = rear.prior;
            }
            start = rear;
            while(rear.next != start){
                System.out.print(rear.data);
                rear = rear.next;
            }
            System.out.print(rear.data);
        }
    }
    public static void main(String[] args) {
        MyBinaryLink myBinaryLink = new MyBinaryLink();
        myBinaryLink.print();
        System.out.println();
        myBinaryLink.printFrom(4);
        System.out.println();
        myBinaryLink.printFrom(-2);
    }
}
时间: 2024-08-24 18:32:30

双向链表实例的相关文章

一起talk C栗子吧(第十五回:C语言实例--双向链表)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们说的是循环链表的例子,这一回咱们说的例子是:双向链表. 看官们,双向链表也是一种链表.我们在前面两回中说到的链表,都是沿着链表头部到链表尾部这样的方 向进行操作,而今天咱们要说的双向链表既可以沿着链表头部到链表尾部这样的方向进行操作,也可以沿 着链表尾部到链表头部这样的方向进行操作.这也是正是叫它双向链表的原因. 在例子中,查找和删除结点

【数据结构】循环链表&amp;&amp;双向链表详解和代码实例

喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 循环链表 1.1 什么是循环链表? 前面介绍了单链表,相信大家还记得相关的概念.其实循环链表跟单链表也没有差别很多,只是在某些细节上的处理方式会稍稍不同. 在此之前,大家可以先思考一个问题:单链表中,要找到其中某个节点只需要从头节点开始遍历链表即可,但是有些时候我们的想法是,能不能从任意节点开始遍历,也能找到我们需要的那个节点呢? 其实啊,这个实现也很简单自然,把整个链表串成一个环问题就迎刃而解了.所以,关于循环链表,

线性链表的双向链表——java实现

.线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为null. 循环链表:一种首尾相连的链表. 双向链表:每个节点有两个引用,一个指向当前节点的上一个节点,另外一个指向当前节点的下一个节点. 下面给出线性表双向链表的实现:java中LinkedList是线性表的链式实现,是一个双向链表. import java.util.NoSuchElementE

「C语言」单链表/双向链表的建立/遍历/插入/删除

最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合,一种面向过程的MVC的感觉. 而这一切的基础就在于对链表的创建.删除.输出.写入文件.从文件读出...... 本篇文章在于巩固链表的基础知识(整理自<C语言程序设计教程--人民邮电出版社>第十章),只对链表的概念及增删改查作出探讨,欢迎指教. 一.链表结构和静态/动态链表 二.单链表的建立与遍历

C++模板和用双向链表实现queue队列

使用C++模板: Template <class或者也可以用typename T> template <class T>//template是标识符 说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型. 注意:template <class T> 有效期只有一次,需要多少次要声明多少次 使用时只要用node<T&

关于如何创建双向链表的解析

链表由无数模块(struct)穿成一串组成,每个模块都有两个指针(双向链表),一个指向上一个模块,一个指向下一个模块,还有一些其他变量用来存储自己想要存储的内容. 嗯,话说作者前几天还想要写一个无限精确度的计算器呢,就想到用链表实现. //这里每一位=一个模块 struct BIT { BIT* previousBit;//指向上一个结构体 int theBit;//这一位数是什么 BIT* nextBit;//指向下一个结构体 }; 这样nextBit 指向一个BIT结构体,BIT结构体之下又

Java中双向链表的代码实现

写在前面: 双向链表是一种对称结构,它克服了单链表上指针单向性的缺点,其中每一个节点即可向前引用,也可向后引用,这样可以更方便的插入.删除数据元素. 由于双向链表需要同时维护两个方向的指针,因此添加节点.删除节点时指针维护成本更大:但双向链表具有两个方向的指针,因此可以向两个方向搜索节点,因此双向链表在搜索节点.删除指定索引处节点时具有较好的性能. Java语言实现双向链表: 1 package com.ietree.basic.datastructure.dublinklist; 2 3 /*

一起talk C栗子吧(第十七回:C语言实例--栈二)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们说的是栈和特点和基本操作,最后通过顺序存储的方式实现了栈,这一回咱们继续 说栈,不过咱们这一回说的是栈的链式存储方式. 在代码中通过双向链表来实现栈的链式存储.入栈操作沿着表头到表尾的方向进行,出栈操作与其正好相 反(就把它当作双向链表的一个使用实例吧).栈的结点可以看作是链表中的结点,对栈的操作,可以看 作是在链表中进行插入或者删除结点

双向链表实现源码

双向链表实现源码public class DuLinkList<T>{//定义一个内部类Node,Node实例代表链表的节点private class Node{//保存节点的数据private T data;//指向上个节点的引用private Node prev;//指向下个节点的引用private Node next;//无参数的构造器public Node(){}//初始化全部属性的构造器public Node(T data , Node prev , Node next){this.