Java实现双向循环链表的基本操作

  1 package Eric.ADT;
  2
  3 /**
  4  * <p>
  5  * Title:doubleLinkedList
  6  * </p>
  7  * <p>
  8  * Description:用java实现双向循环链表的基本操作
  9  * </p>
 10  * <p>
 11  * Location:Frostburg
 12  * </p>
 13  *
 14  * @author: Eric.Chen
 15  * @date:2017年9月23日下午12:54:05
 16  */
 17 public class doubleLinkedList {
 18     class Node {// 节点元素
 19         private Node prev;
 20         public Object value;
 21         private Node next;
 22     }
 23
 24     private Node header = null;
 25
 26     void initiate()// 初始化链表
 27     {
 28         header = new Node();
 29         header.prev = header;
 30         header.value = null;
 31         header.next = header;
 32     }
 33
 34     public void insertList(int i, Object n)// 在链表的i位置插入元素n
 35     {
 36         if (i <= 0 || i > size()) {
 37             System.out.println("插入位置不合法!!!" + "链表长度为:" + size());
 38         } else {
 39             Node e = new Node();
 40             e.value = n;
 41             if (header.prev == header)// 说明这是第一次插入元素,在头结点后面插入元素
 42             {
 43                 e.prev = header;
 44                 e.next = header;
 45                 header.next = e;
 46                 header.prev = e;
 47
 48             } else if (i == size())// 在最后插入元素
 49             {
 50                 e.next = header;
 51                 e.prev = header.prev;
 52                 header.prev.next = e;
 53                 header.prev = e;
 54             } else {// 在i位置插入元素
 55                 Node temp = header;
 56                 int count = 0;
 57                 while (temp.next != header) {
 58                     count++;
 59                     if (count == i) {
 60                         e.next = temp.next;
 61                         e.prev = temp;
 62                         temp.next.prev = e;
 63                         temp.next = e;
 64
 65                     }
 66                     temp = temp.next;
 67                 }
 68
 69             }
 70         }
 71     }
 72
 73     public void deleteByIndex(int i)// 删除指定位置上的元素
 74     {
 75         if (i <= 0 || i > size()) {
 76             System.out.println("删除的位置误" + "链表长度为:" + size());
 77         } else {
 78             Node temp = header;
 79             int count = 0;
 80             while (temp.next != header) {
 81                 count++;
 82                 if (count == i) {
 83                     temp.next = temp.next.next;
 84                     temp.next.prev = temp;
 85
 86                 }
 87
 88                 temp = temp.next;
 89             }
 90
 91         }
 92
 93     }
 94
 95     public int size()// 返回链表的长度
 96     {
 97         int count = 1;
 98         Node temp = header;
 99         while (temp.next != header) {
100             count++;
101             temp = temp.next;
102         }
103
104         return count;
105     }
106
107     public void printList() {
108         Node temp = header;
109         while (temp.next != header) {
110             System.out.print(temp.next.value + " ");
111             temp = temp.next;
112         }
113     }
114
115     public void deleteByEle(Object element)// 删除链表中指定元素
116     {
117         Node temp = header;
118         int count = 0;
119         int num = 0;
120         while (temp.next != header) {
121             count++;
122             if (temp.next.value == element) {
123                 num = count;
124             }
125             temp = temp.next;
126         }
127         deleteByIndex(num);
128     }
129
130     public Object findEleByIndex(int i) {
131         int count = 0;
132         Object p = null;
133         if (i <= 0 || i > size()) {
134             System.out.println("输入数据有错!" + size());
135             return -1;
136         } else {
137             Node temp = header;
138             while (temp.next != header) {
139                 count++;
140                 if (count == i) {
141                     p = temp.next.value;
142                 }
143                 temp = temp.next;
144             }
145         }
146         return p;
147     }
148
149     public static void main(String[] args) {
150         doubleLinkedList list = new doubleLinkedList();
151         list.initiate();
152         for (int i = 1; i <= 10; i++) {
153             list.insertList(i, i);
154         }
155         System.out.println("原来的链表为:");
156         list.printList();
157         System.out.println();
158         System.out.println("链表的长度为:" + list.size());
159         /*list.deleteByEle(8);
160         System.out.println("删除元素后的链表为:");
161         list.printList();
162         System.out.println();
163         System.out.println("删除元素后的链表的长度为:" + list.size());*/
164         int idem =(int) list.findEleByIndex(8);
165         System.out.println(idem);
166
167     }
168 }
时间: 2024-08-07 16:48:50

Java实现双向循环链表的基本操作的相关文章

(java实现)双向循环链表

什么是双向循环链表 在了解双向循环链表之前,如果对链表还没有一个清晰的概念,建议你看看单链表和单向循环链表,这有利于你更好的理解下面的内容.(废话有点多[逃] 相比单链表,双向循环链表是一个更加复杂的结构.因为双向循环链表的节点不仅包含指向下一个节点的指针(next),还包含指向前一个节点的指针(prev). 在双向循环链表中,可见的不只有头指针head,还有尾节点end.这是和单链表的区别. 双向循环链表的头指针head的前一个节点指向end,尾节点end的后一个节点指向head. 基本操作

数据结构_线性表_链式存储_双向循环链表的基本操作

//双向链表,将头结点和尾结点链接起来,就构成了双向循环链表 //双向循环链表是将头结点的前驱指针指向了尾结点,同时将尾结点的后劲指针指向了头结点. //空表,头结点的前驱和后继指针均指向了自己,这也是判断双向循环链表是否为空的条件, //双向循环链表具有对称性 //缺点,是要付出空间代价的 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 代

Java数据结构 - 双向循环链表

class DoubleLoopNode { // 上一个节点 DoubleLoopNode pre; // 下一个节点 DoubleLoopNode next; // 节点的内容 int data; public DoubleLoopNode(int value) { this.pre = this; this.next = this; this.data = value; } // 插入节点 public void append(DoubleLoopNode node) { // 原来的下一

双向循环链表 初始化 插入 删除

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(DuLNode)

小猪的数据结构辅助教程——2.7 线性表中的双向循环链表

小猪的数据结构辅助教程--2.7 线性表中的双向循环链表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.了解引入双向循环链表的原因 2.熟悉双向循环链表的特点以及存储结构 3.掌握双向循环链表的一些基本操作的实现逻辑 4.掌握逆序输出双向循环链表元素逻辑 1.双向循环链表的引入 2.双向循环链表的存储结构 双向循环链表的特点: 上面也说了,空间换时间,比起循环链表只是多了一个指向前驱的指针 特点的话: 判断空表:L ->next = L -> prior = L; 存

带头结点的双向循环链表的表示和实现

线性表的双向链表存储结构 typedef struct DuLNode { ElemType data; DuLNode *prior, *next; }DuLNode, *DuLinkList; 带有头结点的双向循环链表的14个基本操作 void InitList(DuLinkList &L){ L = (DuLinkList)malloc(sizeof(DuLNode)); if (!L)exit(OVERFLOW); L->next = L->prior = L; } void

双向循环链表(C++实现,兼具Boost单元测试)

本文双链表介绍部分参考自博文数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现. 1 双链表介绍 双向链表(双链表)是链表的一种.和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 双链表的示意图如下: 表头为空,表头的后继节点为"节点10"(数据为10的节点):"节点10"的后继节点是"

C语言通用双向循环链表操作函数集

说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序通过链表中的指针链接次序实现.链表由一系列存储结点组成,结点可在运行时动态生成.每个结点均由两部分组成,即存储数据元素的数据域和存储相邻结点地址的指针域.当进行插入或删除操作时,链表只需修改相关结点的指针域即可,因此相比线性

第33课 双向循环链表的实现

1. DTLib中双向链表的设计思路 (1)数据结点之间在逻辑上构成双向循环,这有别于Linux内核链表的实现. (2)头结点仅用于结点的定位,而Linux内核链表是将头结点作为循环的一部分. 2. 实现思路 (1)通过模板定义DualCircleList类,继承自DualLinkList类 (2)在DualCircleList内部使用Linux内核链表进行实现(另类实现) (3)使用struct list_head定义DualCircleList的头结点 (4)特殊处理:循环遍历时忽略头结点