线性表的链式存储

1.接口定义同顺序表的接口定义

 1 package com.neusoft.List;
 2 
 3 /**
 4  * @author SimonsZhao 
 5  * 线性表的基本操作 
 6  *1.线性表置空
 7  *2.线性表判空
 8  *3.求线性表长度
 9  *4.得到第i个元素的值
10  *5.线性表第i个元素之前插入一个元素
11  *6.删除并返回线性表中的第i个元素
12  *7.线性表中首次出现指定数据元素的位置序号
13  *8.输出线性表中的元素
14  */
15 public interface IList {
16     //1.线性表置空
17     public void clear();
18     //2.线性表判空
19     public boolean isEmpty();
20     //3.求线性表长度
21     public int length();
22     //4.得到第i个元素的值
23     public Object get(int i);
24     //5.线性表第i个元素之前插入一个元素
25     public void insert(int i,Object x);
26     //6.删除并返回线性表中的第i个元素
27     public void remove(int i);
28     //7.线性表中首次出现指定数据元素的位置序号
29     public int indexOf(Object x);
30     //8.输出线性表中的元素
31     public void display();
32     
33 }

2.定义存放数据域和指针域的节点信息

 1 package com.neusoft.link;
 2 
 3 public class Node {
 4     public Object data;// 数据域
 5     public Node next;// 指针域
 6     public Node() { //构造空节点
 7         this(null,null);
 8     }
 9     public Node(Object data){//构造有一个参数的数据域
10         this(data,null);
11     }
12     public Node(Object data,Node node){//构造数据域和指针域
13         this.data=data;
14         this.next=node;
15     }
16 }

3.实现接口的所有方法

  1 package com.neusoft.link;
  2 
  3 import java.util.Scanner;
  4 
  5 import com.neusoft.List.IList;
  6 public class LinkedList implements IList {
  7     public Node head;//链表的头指针
  8     public LinkedList() {
  9         head = new Node();//初始化头结点
 10     }
 11     public LinkedList(int n,boolean order){
 12         //如果order=1采用尾插法,如果order=2采用头插法
 13         this();
 14         if (order) {
 15             create1(n);
 16         }else {
 17             create2(n);
 18         }
 19     }
 20     private void create1(int n) {
 21         //尾插法
 22         Scanner sc = new Scanner(System.in);
 23         for (int i = 0; i < n; i++) {
 24             insert(length(), sc.next());
 25         }
 26     }
 27     private void create2(int n) {
 28         //头插法
 29         Scanner sc = new Scanner(System.in);
 30         for (int i = 0; i < n; i++) {
 31             insert(0, sc.next());
 32         }
 33     }
 34 
 35     @Override
 36     public void clear() {
 37         //置空
 38         head.data=null;
 39         head.next=null;
 40     }
 41 
 42     @Override
 43     public boolean isEmpty() {
 44         // 判空
 45         return head.next==null;
 46     }
 47     @Override
 48     public int length() {
 49         // 链表的长度
 50         Node p = head.next;
 51         int length=0;
 52         while (p!=null) {
 53             p=p.next; //指向后继节点
 54             length++;
 55         }
 56         return length;
 57     }
 58 
 59     @Override
 60     public Object get(int i) {
 61         // 读取链表中第i个节点
 62         Node p = head.next;
 63         int j=0;
 64         if (j>i||p==null) {
 65             System.out.println("第"+i+"个元素不存在");
 66         }
 67         while (p!=null&&j<i) {//从头结点开始查找,找到第i各节点或者p的指针域为空停止
 68             p=p.next;
 69             j++;
 70         }
 71         return p.data;
 72     }
 73 
 74     @Override
 75     public void insert(int i, Object x) {
 76         // 在第i个节点之前插入一个值为x的新节点
 77         Node p = head;
 78         int j=-1;
 79         while (p!=null &&j<i-1) {
 80             p=p.next;
 81             j++;
 82         }
 83         if (j>i-1||p==null) {
 84             System.out.println("插入位置不合法");
 85         }
 86         Node s = new Node(x);//新开辟的s节点
 87         if (i==0) {//从头结点进行插入
 88             s.next=head;
 89             head=s;
 90         }else {//从链表中间或表尾进行插入
 91             s.next=p.next;
 92             p.next=s;
 93         }
 94     
 95     }
 96 
 97     @Override
 98     public void remove(int i) {
 99         // 删除单链表的第i个节点
100         Node p = head;
101         int j=-1;
102         while (p.next!=null&&j<i-1) {
103             p=p.next;
104             j++;
105         }
106         if (j>i-1||p.next==null) {
107             System.out.println("删除位置不合法");
108         }
109         p.next=p.next.next;
110     }
111 
112     @Override
113     public int indexOf(Object x) {
114         // 查找值为x的位置
115         Node p = head.next;
116         int j=0;
117         while (p!=null&&!p.data.equals(x)) {
118             p= p.next;
119             j++;
120         }
121         if (p!=null) {
122             return  j;
123         }else {
124             return -1;
125         }
126     }
127 
128     @Override
129     public void display() {
130         // 输出单链表的所有节点
131         Node node = head.next;
132         while(node !=null){
133             System.err.println(node.data+" ");
134             node=node.next;
135         }
136     }
137 
138 }

4.测试代码及结果分析

(输出指定位置元素的直接前驱和后继)

 1 package com.neusoft.link;
 2 
 3 import java.util.Scanner;
 4 
 5 public class LinkedListTest {
 6     public static void main(String[] args) {
 7         int n=10;
 8         LinkedList L= new LinkedList();
 9         for (int i = 0; i < n; i++) {
10             L.insert(i, i);
11         }
12         System.out.println("请输入i的值:");
13         Scanner sc = new Scanner(System.in);
14         int nextInt = sc.nextInt();
15         if (nextInt>0&&nextInt<=n) {
16             System.out.println("第"+nextInt+"个元素的前驱是:"
17                         +L.get(nextInt-1));
18         }else {
19             System.out.println("第"+nextInt+"个元素的前驱不存在");
20         }
21     }
22 }

      结果分析

      

5.补充代码---输出链表的后继节点

 1 package com.neusoft.link;
 2 
 3 import java.util.Scanner;
 4 
 5 public class LinkedListTest {
 6     public static void main(String[] args) {
 7         int n=10;
 8         LinkedList L= new LinkedList();
 9         for (int i = 0; i < n; i++) {
10             L.insert(i, i);
11         }
12         System.out.println("请输入i的值:");
13         Scanner sc = new Scanner(System.in);
14         int nextInt = sc.nextInt();
15         if (nextInt>0&&nextInt<=n) {
16             System.out.println("第"+nextInt+"个元素的前驱是:"
17                         +L.get(nextInt-1));
18         }else {
19             System.out.println("第"+nextInt+"个元素的前驱不存在");
20         }
21         
22         if (nextInt>=0&&nextInt<n-1) {
23             System.out.println("第"+nextInt+"个元素的后继是:"
24                         +L.get(nextInt+1));
25         }else {
26             System.out.println("第"+nextInt+"个元素的后继不存在");
27         }
28     }
29 }
输出链表的前驱和后继元素

显示结果:

      

 END~

原文地址:https://www.cnblogs.com/jackchen-Net/p/6524737.html