分享一个自己用Java实现的单向链表
链表的简单介绍
链表是一种在物理上非连续的存储结构。在单向链表中,每一个节点都是一个对象,其中包含了数据和引用两部分,通过引用指向下一个节点。这种结构相比线性存储结构要复杂,并且由于增加了指针(引用)域导致内存开销更大,但它不像数组那样需要预先知道数据规模,可以充分利用计算机的内存空间。
链表与数组的优缺点对比:
数组的优点:
支持随机访问
查找速度快
数组的缺点:
插入和删除操作效率低
需要预先知道数据规模,并要求存储空间连续
可能浪费存储空间
链表的优点:
插入删除速度快
不需要预先知道数据规模
内存利用率高
长度可变,不需要存储空间连续
链表的缺点:
不支持随机访问,需要从第一个节点开始遍历
下面给出节点的数据结构
LinkNode.png
// 节点的数据结构
public class LinkNode {
public char data;
LinkNode next;
LinkNode(char data){
this.data = data;
}
}
代码实现
public class LinkList {
//头结点
public LinkNode head = null;
//尾插法插入节点
public void AddNode(char data){
LinkNode p = new LinkNode(data);
if(head == null){
head = p;
}
else{
LinkNode t = head;
while(t.next != null){
t = t.next;
}
t.next = p;
}
}
//根据索引删除节点
public void DelNode(int index){
if(index < 0 || index >= Length()){
System.out.println("out of memory");
return;
}
else if(index == 0){
head = head.next;
}
else{
int c = 0;
LinkNode p = head;
LinkNode t = head;
while(c++ < index){
t = p;
p = p.next;
}
t.next = p.next;
}
}
//链表反转
public void ListReverse(){
LinkNode pre = null;
LinkNode next = null;
while(head != null){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
head = pre;
}
//删除链表中的重复元素
public void DelDuplecated(){
LinkNode p = head;
while(p != null){
LinkNode q = p;
while(q.next != null){
if(p.data == q.next.data){
q.next = q.next.next;
}
else{
q = q.next;
}
}
p = p.next;
}
}
//获得链表长度
public int Length(){
int len = 0;
LinkNode p = head;
while(p != null){
len++;
p = p.next;
}
return len;
}
//打印链表
public void PrintList(){
LinkNode p = head;
while(p != null){
System.out.println(p.data);
p = p.next;
}
System.out.println();
}
}