日期:2014-05-20  浏览次数:20728 次

高分求教什么是链表,谢谢各位!(终于可以给高分了,呵呵~~~)
我想请教什么是链表,我有一些编程的基础,我了解数组,但是链表这个东东我实在是搞不懂,能否请各位给举个例子,或用一些代码来实现,在下高分求教,多谢~~~

  顺便问下:我今天刚刚注册,是朋友推荐的。怎么我在发帖时的“帖子问题点数”这一栏只能给“0”分呢?我明明有200可用分呀。

------解决方案--------------------
链表就是在所分的存储区域中把他分成两块,一个事数据域,一个是指针域,指针域就是用来指向下一个存储块的,就好像两个物体之间的一条线把他们连接起来,而数组时一块连续的区域不用指针连接
------解决方案--------------------
好比一群馒头 馒头LZ应该吃过哦?

馒头有2个内容 一个就是外面的皮 一个就是里面的肉

链表就是一群串起来的馒头 馒头的皮 就好像是数据 而馒头的里面的肉就好比是一个线索 里面记录着可以找到下一个馒头的地址

具体来说 你在一个食堂吃馒头 皮吃完了 发现里面写着“下一个馒头在1号教学楼205”
然后你跑到 1号教学楼205 发现里面还真的有一个一模一样的馒头 然后你又吃啊 
吃完皮了 发现里面写着 “下一个馒头在2号教学楼物理实验室”

....
....

然后就是一个大大的循环 也就是说 你找到了第一个馒头 你可以把学校里面的所有馒头都找到并且吃掉
------解决方案--------------------
链接这个地址有定义,有代码,单链表删除插入,双向链表删除插入
http://xiaoerlanglaile.blog.sohu.com/120427163.html
------解决方案--------------------
数组在内存中是顺序存储的,可以顺序访问。
链表在内存中不是顺序存储的,它通过指针存储着下一个元素的地址,从而构成一个链。
------解决方案--------------------
Java code
import java.util.*;

class Node
{
 static int num = 1;
 double data;
 Node next;
 Node prep;
 Node(double ddata,Node nnext,Node pprep)
 {
  data = ddata;
  next = nnext;
  prep = pprep;
 }
 Node(double ddata,Node k,int sign) //0为前,1为后
 {
  data = ddata;
  if(sign == 0)
  {
   this.prep = k;
   k.next = this;
   this.next = null;
      k = Listoper.MoveNodeNex(k);
  }
  else
  {
   this.next = k;
   k.prep = this;
   this.next = null;
   k = Listoper.MoveNodePre(k);
  }
 }
 Node(double ddata)
 {
  data = ddata;
  next = null;
  prep = null;
 }
 Node()
 {
  data = 0;
  next = null;
  prep = null;
 }
 static boolean MakeEmpty(Node Me)
 {
  Me.data = 0;
  Me.next = null;
  Me.prep = null;
  Me = null;
  
  if(Me == null)
   return true;
  return false;
 }
 
 void display()
 {
  System.out.println("节点"+num+"的值为:"+"["+data+"]");
  num++;
 }
}
class Listoper
{
 static void InsertNode(Node ListLoc,Node WorkNode)  //将节点WorkNode 插入在节点ListLoc前面。
 {
       WorkNode = ListLoc.prep.next;
  WorkNode.prep = ListLoc.prep;
   ListLoc.prep = WorkNode;
  WorkNode.next = ListLoc;
 }
 static boolean DeleteNode(Node ListHead,int ddata) //将和ddata相同数据项的节点在链表中删除
 {
  while(ListHead.data != ddata && ListHead != null)
  {
   ListHead = ListHead.next;
  }
  if(ListHead == null)
  {
   return false;
  }
  Node p = new Node();
  p = ListHead;
  p.prep.next = p.next;
  p.next.prep = p.prep;
  
  if(Node.MakeEmpty(p) == true)
   System.gc();
  else
  {
   System.out.println("memory error!");
  }
  return true;
 }
 static void DisplayList(Node Llist)    //打印出链表中各个节点
 {
  while(Llist != null)
  {
   Llist.display();
   Llist = Llist.next;
  }
 }
 static Node MoveNodePre(Node p)         //对链表中当前节点进行前后移位的操作
 {
  return p.prep;
 }
 static Node MoveNodeNex(Node p)
 {
  return p.next;
 }
}

public class ABC
{
 public static void main(String[] args)
 {
  int i;
  Random Rdata = new Random();
  Node head = new Node(Rdata.nextDouble()*100);
  Node p = head;
  for(i = 2; i < 10; i++)
  {
   p = new Node(Rdata.nextDouble()*10000,p,0);
  }
  Listoper.DisplayList(head);
 }
}

------解决方案--------------------
链表和数组有相同地方也有不同的地方
相同之处:都是为了存储数据 那有了数组为什么还要链表呢
因为 链表在存贮空间中不需要空间的存贮位置是连续的
那它怎么才能保证空间不连续的彼此相连呢
因为链表包含两个区域 一个是数据区,一个是指针区,指针区就是来保证链表中个每个单位彼此之间的
联系的
------解决方案--------------------
链表是数据结构的一种
链表的节点包括数据域和指针域
------解决方案--------------------
/**
 * @(#)MyLinkedList.java
 *
 *自定义的LinkedList