先说点题外话:
不知道为什么,我们学校还有别的好多学校的软件院都不学C而直接学C++;
我们信息院就只学了C语言……
不过这也有好处……比如C里面的链表学的比较扎实
C有一个重要的东西叫做指针,用指针指来指去就出来链表了,我们上学期学到了单向链表,就是在每一个struct结构体里面只有一个用来指向下一个节点的指针,结构图如下(自己画的,意思到了……):
这是单向链表,给出了头指针就能找到整条链表。
双向链表就是在每一个节点再加上一个用来指向它前一个节点的指针,这样的好处就是不管给你链表中的任何节点,都能把整个链表找到。
环链表,就是把链表的头和尾相连,具体干什么用现在还不知道……
java里面没有指针这个东西,但是也可以实现链表(有现成的类,但是为了理解链表,还是自己山寨一个吧~以双向链表为例)
类似于C里面的struct结构体,那我们就创建一个节点类LinkNode,里面有三个对象: 一个是只向前一个节点的内容 body 上一个对象 father 下一个对象 son (名字是自己乱起的……)
/**
* 节点类
* @author Micro
*
*/
public class LinkNode {
//一个节点里面有什么东西
private Object body=null;
private LinkNode Father=null;
private LinkNode Son=null;
/**
* 重载构造器
* @param body
*/
public LinkNode(Object body){
this.body=body;
}
public Object getBody() {
return body;
}
public void setBody(Object body) {
this.body = body;
}
public LinkNode getFather() {
return Father;
}
public void setFather(LinkNode father) {
Father = father;
}
public LinkNode getSon() {
return Son;
}
public void setSon(LinkNode son) {
Son = son;
}
}
然后再创建一个链表类 里面写上一些关于这个链表的一些操作方法,比如创建链表,删除节点,添加节点,取得链表长度,遍历链表之类的。
下面一张图是插入操作的示意图(删除和插入差不多,逆过程)
1.先找到下表所对应的节点 Note(名字乱起的)
2.设置要插入的结点的父子指针
3.更改原来链表节点数据的父子子指针
这样插入操作就完成了~~~
下面就是部分山寨链表的代码~~
/**
* 链表
*
* @author Micro
*
*/
public class LinkList {
// 程序入口
public static void main(String[] args) {
LinkList link = new LinkList();
link.creat();
link.printList();
System.out.println("长度为:"+link.size());
}
// 先定义头尾指针
private static LinkNode head = null;
private LinkNode foot = null;
// 创建链表
public void creat() {
for (int i = 0; i < 10; i++) {
String str = "元素" + i;
LinkNode temp = new LinkNode(str);
if (head == null) {
head = temp;
foot = temp;
} else {
temp.setFather(foot);
foot.setSon(temp);
foot = temp;
}
}
}
// 取得链表长度
public int size() {
int n = 0;
LinkNode i;
for (i = head; i != null; i = i.getSon()) {
n++;
}
return n;
}
// 遍历链表
public void printList() {
for (LinkNode i = head; i != null; i = i.getSon()) {
System.out.println(i.getBody());
}
}
}