1、结点类
结点类使用静态内部类实现,代码如下:
private static class Node{
int data;//元素的值
Node next;//指向下一个结点的引用
}
2、单链表初始化
为了方便通常在第一个结点之前附设一个结点,称之头结点,头结点在单链表类的构造函数中初始化,代码如下:
public class SinglyLinkedList {
private Node L; //头结点的引用
private Node P; //用来遍历的引用
private int length; //链表长度
//构造函数,实例化一个新节点作为头结点
public SinglyLinkedList() {
L = new Node(); //初始化头结点
L.next = null; //头结点的引用域置空
}
/*
*...(暂时省略其他代码)
*/
}
3、单链表的取值
取出位置为 i 的值,i 从1开始计数,代码如下。
//取值,获取第i个元素并返回,
public int getElem(int i) {
P=L.next; //初始化,P指向首元结点,计数器j初值为1
int j=1;
while(P!=null && j<i) { //顺链域向后扫描,直到P为空或者P指向第i个元素
P=P.next;
j++;
}
if(P==null || j>i) //i值不合法 P==null表示i>n,j>i说明i<=0
throw new RuntimeException(); //抛着玩
return P.data;
}
注意:首元结点是指存储第一个数据元素的结点,而头结点是指在首元结点之前附设的一个结点,头结点的数据域可以不存任何信息,也可存储于数据元素类型相同的其他附加信息。
4、单链表的按值查找
查找指定元素出现的第一个位置,若未找到该元素则返回-1,代码如下:
//按值查找元素,返回第一个出现该元素的位置,找不到返回-1
public int locateElem(int e) {
P=L.next; //初始化,P指向首元结点
int j=1; //计数器,记录元素的位置
while(P!=null) { //顺链域查找
if(P.data == e) //找到则退出循环
return j;
P=P.next;
j++;
}
return -1;
}
5、单链表的插入
将元素插入到表的第i个结点上,代码如下:
//在指定位置插入元素,插入后该元素位置为i
public boolean listInsert(int i,int e) {
P=L; //P指向头结点,P与P.next之间为插入的位置
int j=0;
while(j<i-1 && P!=null) { //当j==i-1时跳出循环,此时P指向需要插入位置的前一个结点
j++;
P=P.next;
}
if(P==null || j>i-1) //i值不合法,i>n+1或i<1
return false;
Node Q=new Node();
Q.data=e;
Q.next=P.next;
P.next=Q;
length++; //不要忘记链表长度加1
return true;
}
6、单链表的删除
删除指定位置的元素,与插入类似,代码如下:
//删除指定位置的元素
public boolean listDelete(int i) {
P=L;
int j=0;
while(P.next!=null && j<i-1) { //P.next为第i个元素,要确保它存在
P=P.next;
j++;
}
if(P.next==null || j>i-1) {
return false;
}
P.next=P.next.next;
length--; //元素个数减一
return true;
}
7、前插法和尾插法增加元素
直接用的插入删除操作
//前插法增加链表元素
public void createList_H(int e) {
listInsert(1,e);//即在第一个位置插入元素
}
//尾插法增加链表元素
public void createList_R(int e) {
listInsert(length+1,e);//即在最后一个位置的后面插入元素
}
8、其他
public String toString() {
P=L.next;
StringBuilder sb = new StringBuilder("[");
while(P!=null) {
sb.append(P.data);
sb.append(",");
P=P.next;
}
sb.replace(sb.length()-1, sb.length(), "]");
return sb.toString();
}
public int length() {
return length;
}