链表
一、何谓链表
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)访问特定编号的节点。链表不同于数组,数组是有序的而链表是无序无,链表的逻辑顺序通过链表中的指针链接次序实现。链表由节点组成,而节点又有两部分组成,分别为存储数据的数据域与存储下一节点地址的引用指针域。
二、链表的分类
链表可以分为单链表,双链表,循环链表。
单链表:具有头结点尾节点和若干个中间节点,各节点之间通过引用指针链接;
双链表:其实就是单链表中的引用指针具有相反的两个方向,能相互指向;
循环链表:将单链表的头结点与尾节点通过引用指针链接起来就形成了环状结构的循环链表。
三、链表的优点与缺点
优点:链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。相较于数组(有序,大小固定),链表比较方便插入和删除数据(节点)的操作。
缺点:线性表的链式存储表示,有一个缺点就是要找一个数,必须要从头开始找起,十分麻烦。
四、链表的简单实现:
以下是我实现的单向链表:
1、节点类:
public class Node {
public Object obj;
public Node next;//引用
public Node(Object obj) {
this.obj=obj;
}
public void setObj(Object obj){
this.obj=obj;
}
public Object getObject(){
return obj;
}
}
2、链表类:
public class Linkedlist {
private Node root;//头节点
private Node rear;//尾节点
private int size;//记录节点总数的计数器
//添加节点到链表中的方法
public void add(Object obj){
Node node = new Node(obj);
if(root==null){//表示第一次添加节点
root = node;
rear = node;
}else{
rear.next= node;
rear = node;
}
size++;
}
//查找、获取数据
public Object get(int index){
if(index < 0 || index >= size){
throw new RuntimeException("索引越界!");
}
if(index == 0){
return root.obj;
}
Node node = root;
for(int i=0;i<index;i++){
node = node.next;
}
return node.obj;//返回数据
}
//根据索引删除
public Object remove(int index){
if(index < 0 || index >= size){
throw new RuntimeException("索引越界!");
}else{
Node node = root;
for(int i=0;i<index-1;i++){//找到索引节点的上一个
node=node.next;
}
Node nodetemp = node.next;//索引节点(即要删除的节点)
node.next =nodetemp.next ;//将索引从nodetemp的上一个指向nodetemp的下一个
size--;
return nodetemp.obj;//返回数据
}
}
//修改
public void redo(int index,Object obj){
if(index < 0 || index >= size){
throw new RuntimeException("索引越界!");
}else{
Node node = root;
for(int i=0;i<index;i++){
node=node.next;
}
node.setObj(obj);
}
}
public int size(){
return size;//统计链表内的节点个数
}
}
3、测试类:
public class Test {
public static void main(String[] args) {
Linkedlist ll =new Linkedlist();
for(int i=0;i<8;i++){
Object obj1=new Object("张三"+i,i);
ll.add(obj1);
}
//添加
Object obj_1=new Object("王五 ",300);
ll.add(obj_1);
//查找数据
System.out.println("查找的数据为:");
ll.get(6).Show();
//移除数据
System.out.println("移除的数据为:");
ll.remove(3).Show();
//修改数据
Object obj=new Object("李四 ",100);
ll.redo(0, obj);
Print(ll);
}
public static void Print(Linkedlist ll){
for(int t=0;t<ll.size();t++){
Object obj=ll.get(t);
obj.Show();
}
}
}
2014 11 16
梣梓