如何实现链表的增删操作
1.链表
链表是一种最基本的数据结构,其存储特点如下:可以用任意一组存储单元来存储数据元素(存储单元可以不连续),除了存储每个数据元素ai的值外,还存储指示其后继元素的信息。这两部分组成的数据元素ai的存储映像称为结点。N个结点链接在一起称为链表,当结点只包含其后继信息的链表就称为单链表。
2.可定义如下链表类来存储结点信息
public class Node {
int data;
Node next = null;
public Node(int data) {
this.data = data;
}
}
3.链表中最重要的两个操作就是向链表中插入元素和删除元素
(1)插入元素
单链表的插入操作是将值为x的结点插入到链表的第i个结点的位置,即插入到元素ai-1与ai之间。具体步骤如下:
1)找到元素ai-1的存储位置p;
2)生成一个数据域为x的新结点s;
3)设置p.next=s;
4)设置s.next=ai。
(2)删除操作
单链表的删除操作是将单链表的第i个结点删除。具体步骤如下:
1)找到元素ai-1的存储位置p;
2)令p.next直接指向ai的后继结点。
4.实现代码如下:
public class MyLinkedList {
Node head = null; //链表头结点
/**
* 向链表中添加一个元素
* @param data:添加的元素
*/
public void addNode(int data){
Node newNode = new Node(data);
if(head == null){
head = newNode;
return;
}
Node temp = head;
while(temp.next != null){
temp = temp.next;
}
temp.next = newNode;
}
/**
* 删除第index个基点
* @param index:待删除结点索引
* @return 成功返回true,失败返回false
*/
public boolean deleteNode(int index){
//如果删除元素位置不合理
if(index<1 || index>length()){
return false;
}
//删除第index个结点的元素
if(index == 1){
head = head.next;
return true;
}
int i = 2;
Node preNode = head;
Node curNode = head.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 temp = head;
while(temp != null){
length++;
temp = temp.next;
}
return length;
}
/**
* 对链表进行排序
* @return 返回排序后链表的头结点
*/
public Node orderList(){
int temp = 0;
Node curNode = head;
Node nextNode = null;
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 temp = head;
while(temp != null){
System.out.print(temp.data);
temp = temp.next;
}
}
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList();
list.addNode(2);
list.addNode(1);
list.addNode(2);
list.addNode(3);
list.addNode(5);
System.out.println("before order:");
list.printList();
list.orderList();
System.out.println();
System.out.println("after order:");
list.printList();
list.deleteNode(2);
System.out.println();
System.out.println("删除第二个节点后:");
list.printList();
}
}
5.运行结果:
before order:
2 1 2 3 5
after order:
1 2 2 3 5
删除第二个节点后:
1 2 3 5