2019-03-28 java数据结构(二) 单链表
一、理解:
想象一串小袋子,串在一起,一个小袋子代表一个节点,袋子里面可以装东西(数据),这样一个小袋子连接一个小袋子,串起来就像一个单链表。
二、代码实现:
(1)、单链表实现的接口,先展示所有需要实现方法
public interface IList { void clear(); boolean isEmpty(); int size(); Object get(int i) throws Exception; void insert(int i,Object o) throws Exception; int indexOf(Object o);//查询数据在链表的位置 void remove(int i) throws Exception; void display(); }
(2)、节点类
public class Node { public Object data;//存放 数据元素的值 public Node next;//指针域,存放后继节点(后续节点地址) public Node(Object data,Node next){ this.data=data; this.next=next; } public Node(){ this(null,null); } public Node(Object data){ this(data,null); } }
(3)、单链表实现类
public class LinkList implements IList{ public Node head;//单链表头指针 public LinkList(){ head=new Node();//初始化头结点 } //构造一个长度为n的单链表 public LinkList(int n)throws Exception{ this(); create(n); } private void create(int n) throws Exception{ Node p=head; for (int i = 0; i < n; i++) { Node a=new Node("i:"+i); p.next=a; p=a; } } public void clear() { //直接清空表头数据就行 head.data=null; head.next=null; } public boolean isEmpty() { // 判断表头数据 return head.next==null; } public int size() { int i=0; Node p=head; while((p=p.next)!=null) i++; return i; } public Object get(int i) throws Exception { if(i>=size() || i<0) return null; Node p=head; while(i>=0){ p=p.next; i--; } return p.data; } public void insert(int i, Object o) throws Exception { if(i>size() || i<0) throw new Exception("边界超出!!"); Node p=head; //跑到插入位置的前一个节点 for (int j = 0; j < i; j++) { p=p.next; } Node pos=p.next; if(pos==null){ p.next=new Node(o); } else{ p.next=new Node(o); p.next.next=pos; } } public int indexOf(Object o) { int i=0; Node p=head; while((p=p.next)!=null){ if(p.data.equals(o)) return i; i++; } return -1; } public void remove(int i) throws Exception { if(i>=size() || i<0) throw new Exception("边界超出!!"); Node p=head; for (int j = 0; j < i; j++) p=p.next; p.next=p.next.next; } public void display() { Node p=head; while((p=p.next)!=null){ System.out.print(p.data+" "); } System.out.println(); } }
三、代码测试
public class MyTest { public static void main(String[] args) throws Exception { demo2(); } //测试自制链表 LinkList public static void demo2() throws Exception{ LinkList ll=new LinkList(3); ll.display(); ll.insert(2, "insert2"); ll.display(); } }
这里简单弄一个方法出来展示,LinkList 里面所有的方法都已自测过。
四、过程总结
1、在这个方法的实现过程中 public Object get(int i) throws Exception,一开始是将Node返回去了。后面改成将Node,data 返回了。还有其他方法中出现的Object ,是以Node.data来做比较的。
2、实现这些主要是让自己对单链表的思想更清楚。