荷叶罗裙一色裁,芙蓉向脸两边开。 乱入池中看不见,闻歌始觉有人来。----王昌龄
在我第一篇博客中,我利用单链表制作了一个“学生成绩管理系统“。链表有单链表,双链表和循环链表,所以我想就我之前学习的链表,做一个总结,对比分析。
1. 单向链表
2. 双向链表
考虑链表问题的关键在于,你是否一想到链表,脑子里就能马上出现一幅画面
!链表的共同之处,构建节点(node)。
- 单链表node的创建。
class Node{
public int no;//学号
public String name;//姓名
public Node next;//指向下一结点
public Node(int no,String name) {
this.no=no;
this.name=name;
}
}
- 双向链表node的创建。
class Node{
public int no;//学号
public String name;//姓名
public Node next;//向后指针
public Node pre;//向前指针
public Node(int no,String name) {
this.no=no;
this.name=name;
}
}
1. 我们可以看到,单链表的节点创建的方法和双向链表基本一致,所不同的是单链表的指向只有向后一个方向,而双向链表有向前和向后两个方向。
2.一般情况下,我们需要先创建一个头节点,这个头节点仅仅是一个开头的作用,我们一般不会在里面放入数据。而是在头节点指向的下一节点开始放入数据。比如上面这个的头节点,我们一般会这样写:Node head=new Node(0,"" );
3.我们创建了节点类,然后又创建了头节点。那么接下来,我们如何实现链表的增删改查呢?答案是,创建一个“指针”,C语言有指针,但是,我们java怎么可能有指针这个说法呢?其实,我是说相当于指针,不是指针,但是跟指针效果差不多。
4.创建一个指向头节点的“指针(temp)”,让这个指针指向头节点,即:Node temp=head;
5.那么,就单链表而言,增删改查就很清楚了。比如说增加数据。我们就是根据这个“指针”去操作的。
public void add(Node node) {
//增加辅助指针temp,且这个指针指向头结点
Node temp=head;//这样我们创建了辅助指针结点,且这个指针指向了头结点
//前面我们让temp指向了头结点,接下来我们需要找最后一个结点,我们采用遍历的方法
while(true) {
//假设辅助指针指向的下一个结点为空,我们就退出,否则我们就让这个辅助指针依次遍历
if(temp.next==null) {
break;
}
//后一个给前一个
temp=temp.next;
}
//最后一个指向新的结点
temp.next=node;
}
6.我们从删除角度去看下双向链表是怎样工作的。从下面的代码块我们可以知道,其实都差不多,只要脑袋里一直有一幅上面的图片,就很明了了,单链表是一个指向,双向链表是两个指向,只要插入或者删除时考虑两个方向就可以了。
public void delete(Node node) {
Node temp=head.next;
if(temp==null) {
System.out.println("链表为空");
return;
}
while(true) {
if(temp==null) {
break;
}
if(temp.next.no==node.no) {
temp.pre.next=temp.next;
if(temp.next!=null) {
temp.next.pre=temp.next;
}
}
temp=temp.next;
}
}
**
总结
**
针对链表问题,我还是觉得,最重要的是理清楚思路,在脑中自动生成上面的图片,这样理解起来就更简单,而且不容易出错。