Java 链表操作

合集下载

Java散列表以拉链法解决冲突问题(以电话簿为例)

Java散列表以拉链法解决冲突问题(以电话簿为例)

Java散列表以拉链法解决冲突问题(以电话簿为例)原理哈希表的结构哈希表⼜被称为数组链表。

当插⼊删除操作和取值操作都较频繁时,我们可以采⽤哈希表来作为集合的数据结构。

定义:哈希表(Hash table,也叫散列表),是根据关键码值(Key value)⽽直接进⾏访问的数据结构。

也就是说,它通过把关键码值映射到表中⼀个位置来访问记录,以加快查找的速度。

这个映射函数叫做散列函数,存放记录的数组叫做散列表。

⼤致结构如下但是本例题未采⽤Java⾃带的hash集合特点:1.第⼀列是⼀个数组。

因此我们在查找每⼀个链表头结点位置所耗费的时间复杂度都是常数1;2.每⼀⾏都是⼀个链表。

理论上,这个链表可以⽆限扩⼤。

实际上当然是不⾏的,我们可以设想两种极端情况。

⼀种是链表的长度远远⼤于头结点数组的长度,那么这时这个哈希表其实就相当于⼀个链表,它取值操作的时间复杂度还是接近n。

另⼀种情况就是链表的长度远远⼩于头结点数组的长度,那么这时这个哈希表其实就相当于⼀个数组,它插⼊和删除操作的时间复杂度还是接近n。

为了避免这两种极端情况的出现,我们引⼊了⼀个控制变量peakValue(当前哈希表的数据个数/数组长度)。

如果这个值超过了某⼀界限,我们就对当前的哈希表进⾏重构。

3.每⼀次存放和取出数据,都是先找到对应的⾏号(即头结点的位置),然后再去遍历该⾏链表中的各个数据。

哈希表的构建思路基本思路:⾸先我们需要开辟⼀个连续的数组来储存每个头结点,这个数组的⼤⼩是固定的。

每当我们从⽂件中读取出⼀个电话簿,⾸先要将其封装成⼀个节点。

然后根据number计算出相应的code,这个code会定位到唯⼀的⼀个链表头。

最后再把数据放到这个链表⾥⾯。

源代码import java.io.File;import java.io.FileNotFoundException;import java.util.Scanner;public class worktest {class Listnode {String name;String number;Object key;Listnode next;Listnode() {};Listnode(String name, String number) { = name;this.number = number;}Listnode(String name, String number, Listnode next) { = name;this.number = number;this.next = next;}}public void read_file(Listnode []node){File file = new File("d://电话号码.txt");if (!file.exists()){System.out.println("该⽂件不存在");System.exit(0);}try {Scanner scanner = new Scanner(file);while(scanner.hasNext()){String name = scanner.next();String number = scanner.next();Listnode listnode = new Listnode(name,number);listnode.next = null;int i = (number.charAt(10)-'0')%10;//除10取余// System.out.println(i);if(node[i] == null){//简单拉链法存数据node[i] = listnode;}else{listnode.next = node[i].next;node[i].next = listnode;}}} catch (FileNotFoundException e) {e.printStackTrace();}}public void show(Listnode []node){//输出电话簿Listnode listnode = new Listnode();for (int i = 0; i < 10; i++) {listnode = node[i];while (listnode!=null){System.out.println(+" "+listnode.number);listnode = listnode.next;}}}public void search1(Listnode []node, String name){//根据姓名查找 Listnode listnode = new Listnode();for (int i = 0; i < 10; i++) {listnode = node[i];while (listnode != null){if (.equals(name)){System.out.println(+" "+listnode.number); }listnode = listnode.next;}}}public void search2(Listnode []node, String number){//根据电话查找 Listnode listnode = new Listnode();for (int i = 0; i < 10; i++) {listnode = node[i];while (listnode != null){if (listnode.number.equals(number)){System.out.println(+" "+listnode.number); }listnode = listnode.next;}}}public static void main(String[] args) {Scanner in = new Scanner(System.in);worktest test = new worktest();Listnode []node = new Listnode[10];//key%10test.read_file(node);// test.show(node);while(true){System.out.println("请选择查找⽅式:1.按姓名查找,2.按电话查找,(输出其他退出)");int choice = in.nextInt();if (choice == 1){String name = in.next();long startTime = System.currentTimeMillis();//计算查找所消耗的时间test.search1(node,name);long endTime = System.currentTimeMillis();System.out.println("本次查找消耗时间为"+(endTime-startTime)+"微秒");}else if(choice == 2){String number = in.next();long startTime = System.currentTimeMillis();test.search2(node,number);long endTime = System.currentTimeMillis();System.out.println("本次查找消耗时间为"+(endTime-startTime)+"微秒");}elsebreak;}}}⽂件截图总结反思1.把⼀个String字符串转化为int型整数有两种意思。

linkedlist用法

linkedlist用法

linkedlist用法Linkedlist用法Linkedlist是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。

Linkedlist可以用于实现栈、队列、图等数据结构,也可以作为一种独立的数据结构使用。

1. 创建Linkedlist创建一个空的Linkedlist非常简单,只需要定义一个头指针即可。

头指针通常被定义为一个结构体类型的变量,其中包含指向第一个节点和最后一个节点的指针。

2. 插入节点在Linkedlist中插入新的节点有两种方式:在链表头部插入或在链表尾部插入。

对于单向链表来说,在链表中间插入新的节点比较困难。

2.1 在链表头部插入新的节点在链表头部插入新的节点是最简单、最快速的方式。

只需要将新的节点作为第一个节点,并将原来第一个节点作为新节点后面的那个节点即可。

2.2 在链表尾部插入新的节点在链表尾部插入新的节点需要遍历整个链表找到最后一个节点,并将其指向新的节点。

这个过程比较耗时,但是可以保证新加进来的元素总是排在最后面。

3. 删除节点删除Linkedlist中某个特定位置上的元素也有两种方式:删除头部元素或删除尾部元素。

对于单向链表来说,在链表中间删除节点比较困难。

3.1 删除头部元素删除头部元素非常简单,只需要将头指针指向第二个节点即可。

3.2 删除尾部元素删除尾部元素需要遍历整个链表找到倒数第二个节点,并将其指向NULL。

这个过程比较耗时,但是可以保证被删除的元素总是排在最后面。

4. 遍历Linkedlist遍历Linkedlist可以使用循环或递归的方式实现。

循环的方式比较简单,只需要从头指针开始一直遍历到最后一个节点即可。

递归的方式比较复杂,但是可以更加灵活地处理数据。

5. 反转Linkedlist反转Linkedlist也有两种方式:迭代和递归。

迭代的方式需要用三个指针分别表示当前节点、前一个节点和后一个节点,然后依次将当前节点指向前一个节点,并更新三个指针的位置。

java linkedlist 方法

java linkedlist 方法

Java LinkedList 类提供了许多方法,用于操作链表。

以下是一些常用的LinkedList 方法:1. add(E e):在链表末尾添加元素e。

2. add(int index, E element):在指定位置index 插入元素element。

3. addFirst(E e):在链表头部添加元素e。

4. addLast(E e):在链表尾部添加元素e。

5. clear():移除链表中的所有元素。

6. contains(Object o):判断链表中是否包含元素o。

7. containsAll(Collection<?> c):判断链表中是否包含集合c 中的所有元素。

8. get(int index):获取链表中指定位置index 的元素。

9. getFirst():获取链表头部的元素。

10. getLast():获取链表尾部的元素。

11. remove(Object o):移除链表中第一个出现的指定元素o。

12. remove(int index):移除链表中指定位置index 的元素。

13. removeFirst():移除链表头部的元素。

14. removeLast():移除链表尾部的元素。

15. size():返回链表中元素的个数。

16. isEmpty():判断链表是否为空。

17. isSingleton():判断链表是否只有一个元素。

18. poll():移除并返回链表头部的元素,如果链表为空则返回null。

19. pop():移除并返回链表尾部的元素,如果链表为空则抛出NoSuchElementException 异常。

20. peek():返回链表头部的元素,但不移除,如果链表为空则返回null。

21. push(E e):将元素e 添加到链表头部。

22. offer(E e):将元素e 添加到链表尾部,如果成功则返回true,否则返回false。

23. removeFirstOccurrence(Object o):移除链表中第一个出现的指定元素o。

list在java中的用法

list在java中的用法

list在java中的用法在Java中,List是一个接口,它代表着有序的集合。

它允许存储重复的元素,并且能够根据元素的索引来访问和操作集合中的元素。

常用的实现类有ArrayList和LinkedList。

以下是List在Java中的一些主要用法:1. 创建List对象:List<T> list = new ArrayList<T>(); // 创建一个ArrayList对象 List<T> list = new LinkedList<T>(); // 创建一个LinkedList对象2. 添加元素到List中:list.add(element); // 添加元素到末尾list.add(index, element); // 在指定位置插入元素3. 获取List中的元素:T element = list.get(index); // 获取指定位置的元素4. 更新List中的元素:list.set(index, element); // 更新指定位置的元素5. 删除List中的元素:list.remove(index); // 删除指定位置的元素list.remove(element); // 删除指定元素6. 判断List是否包含指定元素:boolean contains = list.contains(element);7. 获取List的大小:int size = list.size();8. 遍历List中的元素:for (T element : list) {// 处理每个元素}9. 将List转换为数组:T[] array = list.toArray(new T[list.size()]);10. 使用迭代器遍历List:Iterator<T> iterator = list.iterator();while (iterator.hasNext()) {T element = iterator.next();// 处理每个元素}这些是List在Java中的主要用法,通过它们可以方便地对集合中的元素进行增删改查操作。

双向链表逆序

双向链表逆序

双向链表逆序双向链表的逆序操作可以通过修改节点之间的引用关系来实现。

具体步骤如下:1. 定义三个指针:pre表示当前节点的前一个节点,cur表示当前节点,next表示当前节点的后一个节点;2. 遍历整个链表,初始时将pre设置为null,cur设置为链表的头节点;3. 在遍历过程中,先将next指向cur的后一个节点;4. 将cur的next指向pre,将cur的prev指向next。

5. 更新pre和cur,将cur指向next,pre指向cur;6. 重复步骤3~5,直到遍历到链表的最后一个节点。

7. 将最后一个节点的prev指向null,表示链表逆序完成。

以下是Java代码示例:```public class DoublyLinkedList {Node head;class Node {int data;Node prev;Node next;Node(int d) {data = d;prev = null;next = null;}}public void reverse() {Node temp = null;Node current = head;while (current != null) {temp = current.prev;current.prev = current.next;current.next = temp;current = current.prev;}if (temp != null) {head = temp.prev;}}}```注意:逆序之后,原来的头结点会变成尾结点,原来的尾结点会变成头结点。

JAVA数据结构——单链表的操作

JAVA数据结构——单链表的操作

单链表的操作方法一:package ch02;(1)建立结点类Node.javapublic class Node {public Object data;//存放结点数据值public Node next;//存放后继结点//无参构造函数public Node(){ this(null,null);}//只有结点值的构造函数public Node(Object data){ this(data,null);}//带有节点值和后继结点的构造函数public Node(Object data,Node next){ this.data=data;this.next=next;}}(2)建立链表及操作LinkList.javapackage ch02;import java.util.Scanner;public class LinkList implements IList{public Node head;//单链表的头指针//构造函数初始化头结点public LinkList(){head=new Node();}//构造函数构造长度为n的单链表public LinkList(int n,boolean Order) throws Exception{ this();if(Order)create1(n); //头插法顺序建立单链表elsecreate2(n); //尾插法逆序建立单链表}//头插法顺序建立单链表public void create1(int n) throws Exception{Scanner sc=new Scanner(System.in);System.out.println("请输入结点的数据(头插法):”);for(int i=0;i<n;i++){insert(0,sc.next());}}//尾插法逆序建立单链表public void create2(int n) throws Exception{Scanner sc=new Scanner(System.in);System. out.println("请输入结点的数据(尾插法):");for(int i=0;i<n;i++){insert(length(),sc.next());}}//将链表置空public void clear(){head.data=null;head.next=null;}//判断链表是否为空public boolean isEmpty(){return head.next==null;}//返回链表长度public int length(){Node p=head.next;int length=0;while(p!=null){p=p.next;length++;//返回P不空长度length加1}return length;}//读取并返回第i个位置的数据元素public Object get(int i) throws Exception {Node p=head.next;int j;//从首结点开始向后查找,直到9指向第i个结点或者p为nullfor(j=0;j<i&&p!=null;j++){ p=p.next;}if(j>i||p==null)//i不合法时抛出异常throw new Exception("第"+i+”个数据元素不存在”);return p.data;}//插入乂作为第i个元素public void insert(int i, Object x) throws Exception{ Node p=head;int j=-1;//寻找第i个结点的前驱i-1while(p!=null&&j<i-1){p=p.next;j++;}if(j>i-l||p==null)//i不合法时抛出异常throw new Exception("插入位置不合法”);Node s=new Node(x);s.next=p.next;p.next=s;}//删除第i个元素public void remove(int i) throws Exception{ Node p=head;int j=-1;while(p!=null&&j<i-1){//寻找第i-1 个节点p=p.next;j++;}if(j>i-1||p.next==null)throw new Exception("删除位置不合法”);p.next=p.next.next;}//返回元素x首次出现的位序号public int indexOf(Object x) {Node p=head.next;int j=0;while(p!=null&&!p.data.equals(x)){p=p.next;j++;if(p!=null)return j;elsereturn -1;}public void display(){Node p=head.next;while(p!=null){if(p.next==null)System.out.print(p.data);elseSystem.out.print(p.data+"f );p=p.next;}}}(3)建立测试类Test.javappublic class test {public static void main(String[] args) throws Exception { // TODO Auto-generated method stubScanner sc=new Scanner(System.in);boolean or;int xz,xx;System.out.println("请选择插入的方法:0、头插法,1、尾插法");xz=sc.nextInt();if(xz!=0)or=true;elseor=false;System. out.println("请插入的结点的个数:”);xx=sc.nextInt();LinkList L=new LinkList(xx,or);System.out.println("建立的链表为:");L.display();System.out.println();System.out.println("链表的长度:"+L.length());System. out.println(”请输入查找的结点的数据:”);Object x=sc.next();int position=L.indexOf(x);System.out.println("结点的数据为:"+x+"的位置为:"+position); System. out.println("请输入删除的结点的位置:”);int sr=sc.nextInt();L.remove(sr);L.display();System.out.println();System.out.println("链表的长度:"+L.length()); }品P rob I em & J a vs d oc / Declaration Q Error Log 里Con sole-M、、■=:termin8ted> test [3] [Java Application] C U &ert\Ad im i n i st rat o r\Ap p Data\L o cs I请选择插入.的方法:0、头插法,lv星插法请插入的特点的个数:请愉入结点的颓据(尾插法):A B C E D F建立的旌表为;A+B T C+E T D+F链表的长度:6请输入查找的结点的数据:结点的数据为:E的位置为:3请输入删除的结点的位置,R+B T E+DW道表的长度:S方法二(引入get和set方法)Package sy;import java.util.Scanner;//单链表的结点类public class Node {private Object data; //存放结点值private Node next; //后继结点的引用public Node() { //无参数时的构造函数this(null, null);}public Node(Object data) { // 构造值为data 的结点this(data, null);}public Node(Object data, Node next) {//构造值为data 和next 的结点构造函数this.data = data;this.next = next;}public Object getData() { return data;}public void setData(Object data) {this.data = data;}public Node getNext() { return next;public void setNext(Node next) { this.next = next;}}//实现链表的基本操作类public class LinkList {Node head=new Node();//生成一个带头结点的空链表//根据输入的一系列整数,以0标志结束,用头插法建立单链表public void creat() throws Exception {Scanner sc = new Scanner(System.in); //构造用于输入的对象for (int x=sc.nextInt(); x!=0; x=sc.nextInt()) //输入若干个数据元素的值(以0结束) insert(0, x);//生成新结点,插入到表头}//返回带头结点的单链表中第i个结点的数据域的值。

java链式写法

java链式写法

java链式写法Java链式写法是一种编程风格,它允许在一个语句中使用多个方法调用,从而使代码更加简洁和易于阅读。

链式写法通常用于构建复杂的对象或执行一系列相关的操作。

下面是一个简单的例子,演示如何使用链式写法创建一个字符串:```String str = new StringBuilder().append("Hello").append(" ").append("World").toString();```在这个例子中,我们使用StringBuilder类创建一个字符串,并使用append()方法将“Hello”、“”和“World”添加到字符串中。

最后,我们使用toString()方法将StringBuilder对象转换为字符串。

注意,每个方法调用都返回一个对象本身,因此我们可以在同一行上调用多个方法。

这使得代码更加简洁和易于阅读。

链式写法还可以用于其他类和方法。

例如,我们可以使用链式写法设置JavaFX中的节点属性:```Button button = new Button().setText("Click me!").setPrefSize(100, 50).setOnAction(e -> System.out.println("Button clicked!"));```在这个例子中,我们使用链式写法设置按钮的文本、首选大小和单击事件处理程序。

这使得代码更加简洁和易于阅读。

总之,Java链式写法是一种简洁、易于阅读的编程风格,可以使代码更加优雅和易于维护。

图解Java数据结构之环形链表

图解Java数据结构之环形链表

图解Java数据结构之环形链表本篇⽂章介绍数据结构中的环形链表。

介绍环形链表,类似于单链表,也是⼀种链式存储结构,环形链表由单链表演化过来。

单链表的最后⼀个结点的链域指向NULL,⽽环形链表的建⽴,不要专门的头结点,让最后⼀个结点的链域指向链表结点。

简单点说链表⾸位相连,组成环状数据结构。

如下图结构:⽽在环形链表中,最为著名的即是约瑟夫环问题。

约瑟夫环问题问题介绍:设编号为1、2、3、... 、n的n个⼈围坐⼀圈,约定编号为k(1<=k<=n)的⼈从1开始报数,数到m的那个⼈出列,它的下⼀位⼜从1开始报数,数到m的那个⼈⼜出列。

依次类推,直到所有⼈出列为⽌,由此产⽣⼀个出队编号的序列。

我们可以举个例⼦来分析⼀下:假设⼀共有5个⼈,即n = 5;从第⼀个⼈开始报数,即k = 1;数到2的⼈出列,即m = 2。

⽰意图如下:出队列的顺序即为:2 -> 4 -> 1 -> 5 -> 3那么我们⾸先得构建出⼀个单向的环形链表。

实现分析:1. 先创建第⼀个节点,让first指向该节点,并形成环状2. 每创建⼀个新的节点就将该节点加⼊到已有的环形链表中分析完毕,我们⽤代码实现⼀下://创建⼀个环形的单向链表class CircleSingleLinkedList {// 创建⼀个first节点,当前没有编号private Boy first = null;// 添加节点,构建成⼀个环形链表System.out.println("数据错误");return;}// 定义辅助节点Boy curBoy = null;// 使⽤循环创建环形链表for (int i = 1; i <= nums; i++) {// 根据编号创建节点Boy boy = new Boy(i);// 如果是第⼀个节点if (i == 1) {first = boy;first.setNext(first);curBoy = first;// 让curBoy指向第⼀个节点,帮助构建链表} else {curBoy.setNext(boy);boy.setNext(first);// 使其指向第⼀个节点,形成环状curBoy = boy;// curBoy后移}}}// 遍历当前环形链表public void list() {// 判断链表是否空if (first == null) {System.out.println("链表为空");return;}// 定义辅助节点Boy curBoy = first;while (true) {System.out.println("节点编号:" + curBoy.getNo());if (curBoy.getNext() == first) {// 此时说明遍历完毕break;}curBoy = curBoy.getNext();// curBoy后移}}}//创建⼀个Boy类,表⽰⼀个节点class Boy {private int no;// 编号private Boy next;// 指向下⼀个节点public Boy(int no) {this.no = no;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public Boy getNext() {return next;}public void setNext(Boy next) {this.next = next;}}这样就实现了⼀个环形链表,接下来测试⼀下:public static void main(String[] args) {CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList(); circleSingleLinkedList.addBoy(5);circleSingleLinkedList.list();}运⾏结果:节点编号:1运⾏结果也是没有问题的,接下来便是⽣成出圈序列。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

链表是一种重要的数据结构,在程序设计中占有很重要的地位。

C语言和C++语言中是用指针来实现链表结构的,由于Java语言不提供指针,所以有人认为在Java语言中不能实现链表,其实不然,Java语言比C和C++更容易实现链表结构。

Java语言中的对象引用实际上是一个指针(本文中的指针均为概念上的意义,而非语言提供的数据类型),所以我们可以编写这样的类来实现链表中的结点。

class Node {
Object data;
Node next;// 指向下一个结点
}
将数据域定义成Object类是因为Object类是广义超类,任何类对象都可以给其赋值,增加了代码的通用性。

为了使链表可以被访问还需要定义一个表头,表头必须包含指向第一个结点的指针和指向当前结点的指针。

为了便于在链表尾部增加结点,还可以增加一指向链表尾部的指针,另外还可以用一个域来表示链表的大小,当调用者想得到链表的大小时,不必遍历整个链表。

下图是这种链表的示意图:
链表的数据结构
我们可以用类List来实现链表结构,用变量Head、Tail、Length、Pointer来实现表头。

存储当前结点的指针时有一定的技巧,Pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点。

那么为什么要这样做呢?这是因为当删除当前结点后仍需保证剩下的结点构成链表,如果Pointer指向当前结点,则会给操作带来很大困难。

那么如何得到当前结点呢,我们定义了一个方法cursor(),返回值是指向当前结点的指针。

类List还定义了一些方法来实现对链表的基本操作,通过运用这些基本操作我们可以对链表进行各种操作。

例如reset()方法使第一个结点成为当前结点。

insert(Object d)方法在当前结点前插入一个结点,并使其成为当前结点。

remove()方法删除当前结点同时返回其内容,并使其后继结点成为当前结点,如果删除的是最后一个结点,则第一个结点变为当前结点。

链表类List的源代码如下:
import java.io.*;
public class List {
/* 用变量来实现表头 */
private Node Head = null;
private Node Tail = null;
private Node Pointer = null;
private int Length = 0;
public void deleteAll() {/* 清空整个链表 */
Head = null;
Tail = null;
Pointer = null;
Length = 0;
}
public void reset() {/* 链表复位,使第一个结点成为当前结点 */
Pointer = null;
}
public boolean isEmpty() {/* 判断链表是否为空 */
return (Length == 0);
}
public boolean isEnd() {/* 判断当前结点是否为最后一个结点 */
if (Length == 0)
throw new ng.NullPointerException();
else if (Length == 1)
return true;
else
return (cursor() == Tail);
}
public Object nextNode() {/* 返回当前结点的下一个结点的值,并使其成为当前结点 */
if (Length == 1)
throw new java.util.NoSuchElementException();
else if (Length == 0)
throw new ng.NullPointerException();
else {
Node temp = cursor();
Pointer = temp;
if (temp != Tail)
return (temp.next.data);
else
throw new java.util.NoSuchElementException();
}
}
public Object currentNode() {/* 返回当前结点的值 */
Node temp = cursor();
return temp.data;
}
public void insert(Object d) {/* 在当前结点前插入一个结点,并使其成为当前结点 */
Node e = new Node(d);
if (Length == 0) {
Tail = e;
Head = e;
} else {
Node temp = cursor();
e.next = temp;
if (Pointer == null)
Head = e;
else
Pointer.next = e;
}
Length++;
}
public int size() {/* 返回链表的大小 */
return (Length);
}
/**
* 将当前结点移出链表,下一个结点成为当前结点,如果移出的结点是最后一个结点,则第一个结点成为当前结点
* */
public Object remove() {
Object temp;
if (Length == 0)
throw new java.util.NoSuchElementException();
else if (Length == 1) {
temp = Head.data;
deleteAll();
} else {
Node cur = cursor();
temp = cur.data;
if (cur == Head)
Head = cur.next;
else if (cur == Tail) {
Pointer.next = null;
Tail = Pointer;
reset();
} else
Pointer.next = cur.next;
Length--;
}
return temp;
}
private Node cursor() {/* 返回当前结点的指针 */
if (Head == null)
throw new ng.NullPointerException();
else if (Pointer == null)
return Head;
else
return Pointer.next;
}
public static void main(String[] args){/* 链表的简单应用举例 */ List a = new List();
for (int i = 1; i <= 10; i++)
a.insert(new Integer(i));
System.out.println(a.currentNode());
while (!a.isEnd())
System.out.println(a.nextNode());
a.reset();
while (!a.isEnd()) {
a.remove();
}
a.remove();
a.reset();
if (a.isEmpty())
System.out.println("There is no Node in List \n");
System.out.println("You can press return to quit\n");
try {
System.in.read();
// 确保用户看清程序运行结果
} catch (IOException e) {
}
}
}
class Node{/* 构成链表的结点定义 */
Object data;
Node next;
Node(Object d) {
data = d;
next = null;
}
}
读者还可以根据实际需要定义新的方法来对链表进行操作。

双向链表可以用类似的方法实现只是结点的类增加了一个指向前趋结点的指针。

可以用这样的代码来实现:
class Node {
Object data;
Node next;
Node previous;
Node(Object d) {
data = d;
next = null;
previous = null;
}
}
当然,双向链表基本操作的实现略有不同。

链表和双向链表的实现方法,也可以用在堆栈和队列的实现中,这里就不再多写了,有兴趣的读者可以将List类的代码稍加改动即可。

相关文档
最新文档