链表是一种重要的基础数据结构,它是一种线性表,链表的优点正是数组的缺点,链表的缺点正是数组的优点。链表实现了灵活的内存动态管理,但是因为链表多了指针域,所以它的空间开销比较大。
链表的基本单位是节点。节点保存着两个信息,一个是数据信息,另一个是下一个的地址信息。最后一个节点的地址信息是null.链表的访问只能靠指针从头结点顺次访问,这是链表的缺点。链表天生的好处就是他可以随意的增删。
链表的增加一个节点的过程是先把该节点指向下一个节点,然后原本下一个节点的上峰指向要增加的节点。例如有1,3两个节点,要将2插入之间,那么先将2指向3,随后再让1指向2即可。
链表的删除也是有一定的过程。让该删除节点的上峰指向要被删除节点的以一个节点即可。例如有1,2,3三个节点,要想删除2节点,直接让1节点指向3节点即可。在单项链表中,因为不可能查看上一个节点,所以2节点永远也访问不到了。
以下模仿了Java的自带类LinkedList。
public class LinkedIntList {
public class LinkedNode{
public int data;
public LinkedNode next;
public LinkedNode()
{
this(0,null);
}
public LinkedNode(int data)
{
this(data,null);
}
public LinkedNode(int data,LinkedNode next)
{
this.data=data;
this.next=next;
}
}
private LinkedNode front;
private int size;
public int Size()
{
return size;
}
public LinkedIntList()
{
front=null;
}
public void add(int data)
{
if (front==null)
{
front=new LinkedNode(data);
}
else
{
LinkedNode current=front;
while (current.next!=null)
{
current=current.next;
}
current.next=new LinkedNode(data);
}
size++;
}
public void add(int index,int value)
{
if (index==0)
{
front=new LinkedNode(value,front);
}else
{
LinkedNode current=front;
for (int i=0;i<index-1;i++)
{
current=current.next;
}
LinkedNode temp= new LinkedNode(value,current.next);
current.next=temp;
}
}
@Override
public String toString()
{
if (front==null)
{
return "[]";
}
LinkedNode current=front;
String result="["+current.data;
current=current.next;
while (current!=null)
{
result+=","+current.data;
current=current.next;
}
result+="]";
return result;
}
public int indexOf(int value)
{
LinkedNode current=front;
int index=0;
while (current.next!=null)
{
if (current.data==value)
{
return index;
}
else
{
index++;
current=current.next;
}
}
return -1;
}
public void remove(int index)
{
if (index==0)
{
front=front.next;
}else
{
LinkedNode current= front;
for (int i=0;i<index-1;i++)
{
current=current.next;
}
current.next=current.next.next;
}
}
public int get(int index)
{
LinkedNode current=front;
for (int i=0;i<index;i++)
{
current=current.next;
}
return current.data;
}
}