单链表是数据结构中以动态结构存储的线性结构,在Java语言中,一般用本类对象引用的方式在内存中将一组相同类型的对象存储,熟悉单链表的基本操作有助于灵活解决此类算法问题。
1.单链表中的节点可以用节点类型描述如下:
public class Lnode{ public char data; public Lnode next; }
2.单链表可以按如下的类进行封装:
public class LinkedList{ Lnode h = null; public LinkedList(){...} public insertElement(char ch,int i){...} //...省略方法 }
3.头插法建立单链表
public LinkedList(String str){ h = new Lnode; h.next = null; int i = 0; Lnode p; char ch; while(i<str.length()){ ch = str.charAt(i); p = new Lnode(); p.data = ch; p.next = h.next; h.next = p; i++; } }
4.尾插法建立单链表
public LinkedList(String str){ h = new Lnode(); h.next = null; char ch; Lnode p; Lnode t = h; int i = 0; while(i<str.length()){ ch = str.charAt(i); p = new Lnode; p.data = ch; p.next = null; t.next = p; t = p; i++; } }
5.求单链表的长度
public int size(){ int i = 0; Lnode p = h.next; while(p!=null){ i++; p = p.next; } return i; }
6.1 在单链表某节点之后插入新节点
public void insertElementAfter(Lnode p,char ch){ Lnode s = new Lnode(); s.data = ch; s.next = p.next; p.next = s; }
6.2 在单链表第i个元素之前插入一个元素
public int insertElementAt(int i,char ch){ Lnode p; int k = 0; p = h.next; while(p!=null&&k<i-1){ p = p.next; k++; } if(p!=null){ Lnode s = new Lnode(); s.data = ch; s.next = p.next; p.next = s; return 1; } return 0; }
7.删除单链表中某节点的后继节点
public void remove(Lnode p){ if(p.next!=null){ Lnode s = p.next; p.next = s.next; s = null; } }
8.1 按值查找
public Lnode search(char ch){ Lnode p = h.next; while(p!=null&&p.data!=ch){ p = p.next; } return p; }
8.2 按位置查找
public Lnode get(int i){ Lnode p = h.next; int k = 0; while(p!=null&&k<i){ p = p.next; k++; } if(i==k) return p; else return null; }