单链表的概念
当节点只包含其后继节点的信息的链表就被称为单链表。
链表存储特点
可以使用任意一组存储单元来存储单链表中的数据元素(存储单元可以是不连续的),而且除了存储每个数据元素的ai的值外,还必须存储只是其后继元素的信息。
Java语言中,如下的数据类来实现存储节点的信息
class Node {
Node next = null;
int data;
public Node(int data){
this.data = data;
}
}
链表中最重要的操作就是在链表中插入和删除操作
单链表的插入操作
单链表的插入操作是将值为x的新节点插入到单链表的第i个节点的位置上,即插入到数据元素ai-1的后继节点,具体步骤如下
1)找到ai-1的引用(存储位置)p。
2)生成一个数据域为x的新节点s。
3)设置 s.next=p.next;
4)设置 p.next=s;
单链表的删除操作
单链表的删除操作是将单链表的第i个节点删去。其具体步骤如下:
1)找到ai-1的存储位置p。
2)令p.next指向ai的直接后继节点(即把ai从链上摘下)ai+1;
下面链表操作实例给出了链表的具体操作
public class MyLinkedList {
Node head = null;
/**
向链表中插入数据
@param id: 插入数据的内容
**/
public void addNode(int id) {
Node newNode = new Node(id);
if (head == null) {
head = newNode;
return;
}
Node tmp = head;
while (tmp.next != null) {
tmp=tmp.next;
}
//add mode to end
tmp.next = newNode;
}
/**
*
* @param index 删除第index个节点
* @return 成功返回true,失败不合法返回false
*/
public Boolean deleteNode(int index) {
if (index<1 || index > length()){
return false;
}
//删除链表中的第一个元素
if (index==1){
head = head.next;
return true;
}
int i=2;
Node preNode = head;
Node curNode = preNode.next;
while (curNode != null){
if (i == index){
preNode.next = curNode.next;
return true;
}
preNode = curNode;
curNode = curNode.next;
i++;
}
return true;
}
/**
*
* @return 返回单链表的长度
*/
public int length(){
int length = 0;
Node tmp = head;
while (tmp!= null){
length++;
tmp = tmp.next;
}
return length;
}
/**
* 对链表进行排序,从链表的第一个结点开始,将后面节点一次和当前节点进行比较,保证单链表在curNode之前的节点是有序的
* @return 返回排序后的头节点
*/
public Node orderList(){
Node nextNode = null;
int temp = 0;
Node curNode = head;
while (curNode.next != null){
nextNode = curNode.next;
while (nextNode != null){
if (curNode.data > nextNode.data){
temp = curNode.data;
curNode.data = nextNode.data;
nextNode.data = temp;
}
nextNode = nextNode.next;
}
curNode = curNode.next;
}
return head;
}
/**
* 将单链表节点信息全部打印
*/
public void printList(){
Node tmp = head;
while(tmp!=null){
System.out.println(tmp);
tmp = tmp.next;
}
}
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList();
list.addNode(5);;
list.addNode(3);;
list.addNode(1);;
System.out.println("listLen = "+list.length());
System.out.println("before order");
list.printList();
list.orderList();
System.out.println("after order");
list.printList();
}
}
运行结果
listLen = 3
before order
Node{data=5}
Node{data=3}
Node{data=1}
after order
Node{data=1}
Node{data=3}
Node{data=5}