数据结构中有链表、栈、队列、排序、数组、树。下面学习单链表。
单链表概念
链表是最基本的数据结构,以head为头节点,头结点并不存放任何数据,它是链表的开始,指向链表中第一个节点,而每个节点都有一个next的向下引用,指向下一个节点,直到最后一个节点。每一个节点由两部分组成,包括data(存放数据),next(指向下一个节点),下面是单链表的基本形式。
单链表用java定义如一下代码。
class Node{
int data;//数据
Node next=null;//节点的引用,指向下一个节点
public Node(int data){
this.data=data;
}
}
对于链表的增加或者删除一个节点相对于顺序表来说则是比较高效的,链表只需要改变节点之间的引用关系,而顺序表还需要移动元素,如果不理想的话,甚至要移动所有数据,这也就造成了顺序表和链表之间对于增删效率的差异,下面用java实现以下单链表增加节点和删除节点的情况。
单链表增加节点
上图也就简单的说明了在中间插入一个节点,只需要改变节点之间的引用关系即可。下面贴出用java实现的增加节点的代码。
//向链表末尾添加节点
public void addNode(int data){
Node node=new Node(data);
if(head==null){
head=node;
return;
}
Node temp=head;
while(temp.next!=null){
temp=temp.next;
}
temp.next=node;
}
//向固定位置添加节点
public void addNode(int index,int data){
Node node=new Node(data);
if(index<1||index>length()-1)
return;
Node temp=head;
int i=0;
while(temp.next!=null){
//遍历到目标节点时,前一个节点为temp 当前节点为temp.next 后一个节点为temp.next.next
if(index==i++){
node.next=temp.next.next;//将目标节点的引用指向,后一个节点
temp.next=node;//将前一个节点的应用指向node
}
temp=temp.next;
}
- }
单链表删除节点
//删除节点
public void deleteNode(int index){
if(index<1||index>length()-1){
return;
}
if(head==null)
return;
Node temp=head;
int length=1;
while(temp.next!=null){
//当前节点为temp.next 前一个节点为temp 后一个节点为temp.next.next
if(index==length++){
temp.next=temp.next.next;
return;
}
temp=temp.next;
}
}
以上也只是自己对单链表的增加和删除链表节点简单总结。
双链表的概念
双链表是每个节点有两个地址的线性表链表,两个地址分别指向前驱节点和后继节点。下面贴出双链表的部分结构。
用java实现双链表的代码如下。
class DoubleNode{
int data;//存放数据
DoubleNode pre,next;//节点的前驱,后继节点
public DoubleNode(int data, DoubleNode pre, DoubleNode next) {
super();
this.data = data;
this.pre = pre;
this.next = next;
}
}
双链表增加节点
public void addNode(int n,int data){
DoubleNode temp=head;
int length=0;
while(temp.next!=null){
//当前节点为temp.next 前驱节点为temp 后继节点temp.next.next
if(n==length++){
DoubleNode node=new DoubleNode(1,temp,temp.next);
temp.next=node;//前驱节点的后继节点为node,
temp.next.pre=node;//插入节点的后继节点的前驱为node
}
temp=temp.next;
}
}
双链表删除节点
public void deleteNode(int n){
DoubleNode temp=head;
int length=0;
while(temp.next!=null){
//当前节点为temp.next 前驱节点为temp 后继节点temp.next.next
if(n==length++){
temp.next=temp.next.next;
temp.next.next.pre=temp;
}
temp=temp.next;
}
}
通过以上分析,我们知道双链表在单链表的结构上增加了前驱节点,这使得双链表可以在两个方向遍历,访问前驱节点和后继节点。