自己写的一个双向链表容器

  1 package com.lovo;
  2
  3 public class SuperLinkedList <T>{
  4     private int size;
  5     private SuperLinkedListNode<T> firstNode;
  6     private SuperLinkedListNode<T> lastNode;
  7     /**
  8      * 添加元素(添加在链表的末尾)
  9      * @param o
 10      */
 11     public void add(T o) {
 12         SuperLinkedListNode<T> node = new SuperLinkedListNode<T>();
 13         if (size == 0) {
 14             node.setContent(o);
 15             node.setNextNode(null);
 16             node.setLastNode(null);
 17             firstNode = node;
 18             lastNode = node;
 19             size++;
 20         }else {
 21             if (!isRepeat(o)) {
 22                 node.setContent(o);
 23                 node.setNextNode(null);
 24                 node.setLastNode(lastNode);
 25                 lastNode.setNextNode(node);
 26                 lastNode = node;
 27                 size++;
 28             }
 29         }
 30     }
 31     /**
 32      * 插入元素
 33      * @param o 元素值
 34      * @param index 元素位置
 35      */
 36     public void insert(T o,int index) {
 37         SuperLinkedListNode<T> node = new SuperLinkedListNode<T>();
 38         if (index >= size || index < 0) {
 39             throw new ArrayIndexOutOfBoundsException();
 40         }else {
 41             SuperLinkedListNode<T> tempNode = firstNode;
 42             for (int i = 0; i < index; i++) {
 43                 tempNode = tempNode.getNextNode();
 44             }
 45             if (!isRepeat(o)) {
 46                 node.setContent(o);
 47                 node.setNextNode(tempNode);
 48                 if (index != 0) {
 49                     SuperLinkedListNode<T> lastNode = tempNode.getLastNode();
 50                     node.setLastNode(lastNode);
 51                     lastNode.setNextNode(node);
 52                     tempNode.setLastNode(node);
 53                 } else {//插入的是头元素
 54                     node.setLastNode(null);
 55                     tempNode.setLastNode(node);
 56                     firstNode = node;
 57                 }
 58                 size++;
 59             }
 60         }
 61     }
 62     /**
 63      * 按索引取元素
 64      * @param index 下标值
 65      * @return 下标值对应的元素
 66      */
 67     public SuperLinkedListNode<T> get(int index) {
 68         if (index < 0 || index >= size) {
 69             throw new ArrayIndexOutOfBoundsException();
 70         }
 71         SuperLinkedListNode<T> node = firstNode;
 72         for (int i = 0; i < index; i++) {
 73             node = node.getNextNode();
 74         }
 75         return node;
 76     }
 77     /**
 78      * 通过索引删除元素
 79      * @param index 索引值
 80      */
 81     public void removeAt(int index) {
 82         if (index < 0 || index >= size) {
 83             throw new ArrayIndexOutOfBoundsException();
 84         }
 85         SuperLinkedListNode<T> node = firstNode;
 86         for (int i = 0; i < index; i++) {
 87             node = node.getNextNode();
 88         }
 89         SuperLinkedListNode<T> nextNode = node.getNextNode();
 90         SuperLinkedListNode<T> lastNode = node.getLastNode();
 91         if (nextNode == null) {
 92             if (lastNode != null) {//size为1
 93                 node.clear();
 94                 lastNode.setNextNode(null);
 95                 this.lastNode = lastNode;
 96             }
 97         }else {
 98             if (lastNode == null) {
 99                 nextNode.setLastNode(null);
100                 firstNode = nextNode;
101             }else {
102                 lastNode.setNextNode(nextNode);
103                 nextNode.setLastNode(lastNode);
104             }
105         }
106         node.clear();
107         size--;
108     }
109     /**
110      * 通过元素值删除元素
111      * @param o 删除的元素
112      */
113     public void remove(T o) {
114         if (o != null) {
115             SuperLinkedListNode<T> node = firstNode;
116             for (int i = 0; i < size; i++) {
117                 if (o.equals(node.getContent())) {
118                     removeAt(i);
119                 }
120                 node = node.getNextNode();
121             }
122         }
123     }
124     /**
125      * 清空容器
126      */
127     public void clear() {
128         SuperLinkedListNode<T> node = firstNode;
129         for (int i = 0; i < size - 1; i++) {
130             SuperLinkedListNode<T> tempNode = node.getNextNode();
131             node.clear();;
132             node = tempNode;
133         }
134         node.clear();
135         size = 0;
136     }
137     /**
138      * 得到容器大小
139      * @return
140      */
141     public int size() {
142         return size;
143     }
144     /**
145      * 判断元素值是否重复(已经存在)
146      * @param o 要比较的值
147      * @return true:相同 false:不相同
148      */
149     private boolean isRepeat(T o){
150         SuperLinkedListNode<T> tempNode = firstNode;
151         boolean flag = false;
152         for (int i = 0; i < size; i++) {
153             if(o.equals(tempNode.getContent())){
154                 flag = true;
155             }
156             tempNode = tempNode.getNextNode();
157         }
158         return flag;
159     }
160 }
 1 package com.lovo;
 2
 3 public class  SuperLinkedListNode<T>{
 4     private SuperLinkedListNode<T> nextNode;
 5     private SuperLinkedListNode<T> lastNode;
 6     private T content;
 7     /**
 8      * 清空节点
 9      */
10     public void clear() {
11         nextNode = null;
12         lastNode = null;
13         content = null;
14     }
15     public SuperLinkedListNode<T> getNextNode() {
16         return nextNode;
17     }
18     public void setNextNode(SuperLinkedListNode<T> nextNode) {
19         this.nextNode = nextNode;
20     }
21     public SuperLinkedListNode<T> getLastNode() {
22         return lastNode;
23     }
24     public void setLastNode(SuperLinkedListNode<T> lastNode) {
25         this.lastNode = lastNode;
26     }
27     public T getContent() {
28         return content;
29     }
30     public void setContent(T content) {
31         this.content = content;
32     }
33     @Override
34     public String toString() {
35         return "SuperLinkedListNode [content=" + content + "]";
36     }
37
38 }
时间: 2024-08-11 01:33:03

自己写的一个双向链表容器的相关文章

《Effective C 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

条款25考虑写出一个不抛出异常的swap函数 条款25:考虑写出一个不抛出异常的swap函数 swap是STL中的标准函数,用于交换两个对象的数值.后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制.swap的实现如下: namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp;

如何正确地写好一个界面

写界面可以说是每位移动应用开发者的基本功,也是一位合格移动应用开发者绕不过去的坎.但就如不是每一位开发者都能够成为合格的开发者一样,本人在 不同的团队中发现,甚少有人能够编写出合格的UI代码:而非常奇怪的是,在很多的开发者论坛上看到我们移动开发者更多关注于某个控件或者是动画,但却很少 看到深入剖析UI机制,指导UI开发的文章. 由于界面涉及到的方面实在过于广泛,本文不可能事无巨细,一一道来,所以本文先立足于点,深入剖析iOS UI系统中不被重视却非常重要的机制,帮助本文读者对iOS的UI系统有整

Effective C++ Item 25 考虑写出一个不抛异常的swap函数

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常 示例: stl里的swap算法 namespace std{ template<typename T> void swap(T &a, T &b){ T temp(a); a = b; b = temp; } } //"pimpl手法"(pointer

C++ Primer 学习笔记_13_标准模板库_list双向链表容器

C++ Primer 学习笔记_13_标准模板库_list双向链表容器 list容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表,这样,对链表的任一位置的元素进行插入.删除和查找都是超快速的.下图是双向循环链表的结构示意图. list的每个节点有三个域:前驱元素指针域.数据域和后继元素指针域.前驱元素指针域保存了前驱元素的首地址:数据域则是本节点的数据:后继元素指针域则保存了后继元素的首地址.list的头结点的前驱元素指针域保存的是链表中尾元素的首地址,而list的尾

用c语言完成一个双向链表的创建,插入,删除

/*dlist.h*/ #ifndef DList_H #define DList_H typedef  int Item; typedef struct Node * PNode;  //节点指针 typedef PNode Position;  //节点位置 /*定义节点类型*/ typedef struct Node { Item data;      /*数据域*/ PNode previous; /*指向前驱*/ PNode next;     /*指向后继*/ }Node; /*定义

《Effective C++》item25:考虑写出一个不抛异常的swap函数

std::swap()是个很有用的函数,它可以用来交换两个变量的值,包括用户自定义的类型,只要类型支持copying操作,尤其是在STL中使用的很多,例如: int main(int argc, _TCHAR* argv[]) { int a[10] = {1,2,3,4,5,6,7,8,9,10}; vector<int> vec1(a, a + 4); vector<int> vec2(a + 5, a + 10); swap(vec1, vec2); for (int i =

去年方百度首页播放器写的一个js代码,先记录一下,不支持火狐了,改天用autio改改

播放器内核使用的是 object 或embed 刚刚测试了下,最新的火狐不支持了,IE 360还能用,改天换成audio来做吧 这里先记录下来 支持下一曲,暂停,开始 使用方法很简单: 该代码很简单,使用js实现,使用方法很简单 1.引入css:<link href="css/StyleSheet.css" rel="stylesheet" type="text/css" />2.引入js:<script src="j

这两天自己模仿写的一个Asp.Net的显示分页方法 附加实体转换和存储过程

之前自己一直用Aspnetpager控件来显示项目中的分页,但是每次都要拖一个aspnetpager的控件进去,感觉很不舒服,因为现在自己写的webform都不用服务器控件了,所以自己仿照aspnetpager写了一个精简实用的返回分页显示的html方法,其他话不说了,直接上代码. 分页显示信息的实体类:  public class Pager    {        private string _firstPageText;        /// <summary>        ///

创建一个双向链表数据结构

这是书上的一道练习题,要求创建一个双向链表数据结构Ring,它是一个环形的结构,Ring必须支持从当前位置单步地前进或回退. add方法在当前元素之后添加元素,支持使用for-each.任何因环空而导致的无效操作,Ring类支持抛出适当的异常. 此外,不能继承LinkedList,也就是说只能自己单写一个. 解题的思路很简单,既然LinkedList就满意要求,那么再做一个LinkedList就可以了. 直接拿LinkedList源码来分析. 首先LinkedList创建了一个内部结点类:Nod