高分求教什么是链表,谢谢各位!(终于可以给高分了,呵呵~~~)
我想请教什么是链表,我有一些编程的基础,我了解数组,但是链表这个东东我实在是搞不懂,能否请各位给举个例子,或用一些代码来实现,在下高分求教,多谢~~~
顺便问下:我今天刚刚注册,是朋友推荐的。怎么我在发帖时的“帖子问题点数”这一栏只能给“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
* @author
* @version 1.00 2009/10/12
*/
//节点类
class Node{
//数据区域
public Object data;
//地址区域
public Node next;
public Node(){
}
public Node(Object data){
this.data = data;
}
}
public class MyLinkedList {
//头节点
private Node header;
//尾节点
private Node tailer;
//记录当前元素个数
private int size;
public MyLinkedList(){
header = new Node();
header.next = header;
tailer = header;
size = 0;
}
public int size(){
return size;
}
// 将指定元素追加到此列表的结尾。
public void add(Object o) {
//1.出现一个新的节点
Node newNode = new Node(o);
//2.原尾节点指向新的节点
tailer.next = newNode;
//3.新节点称为新的尾节点
tailer = newNode;
size ++;
}
//返回此列表中指定位置处的元素。
public Object get(int index) {
//指定当前元素索引号
int count = 0;
//设定游标
Node currentNode = header;
Object obj = null;
for(int i = 0;i < size;i++){
//1.当前游标移动一个位置
currentNode = currentNode.next;
if(count == index){
//如果当前的索引等于指定的索引号
obj = currentNode.data;
break;
}
count++;
}
return obj;
}
}
[解决办法]
这个问题不应该给那么多高分啊!
随便Google一下!
就能得到很多详细的解释
这个问题 要学习深入,靠这里的帖子是不行的!
搜索一本经典的数据结构好好看看吧!
顺便说下,如果楼主是大学生 最好自己再买本经典的数据结果教材! 学校给买的多数不靠谱!
学校。。。 不说了!
[解决办法]
http://baike.baidu.com/view/178622.htm百度百科
[解决办法]
http://student.csdn.net/space.php?uid=46868&do=blog&id=12008
[解决办法]
LZ该看数据结构了~~