链表
链表是有顺序的表,在内存中存储:
- 链表是以节点的方式存储的
- 每个节点包括data域,next域:指向下一个节点
- 如图:发现链表的各个节点不一定是连续存放的,有跳跃的,不是连续存储
- 链表分为带头节点的链表和没有头结点的链表
添加:
1.先创建一个head头结点,作用就是单链表的头
2.后面每添加一个节点,就直接加入到链表最后
遍历:
代码
添加节点到链表里:
这里借助于temp节点,通过循环找到链表的最后
/*
* 函数:添加节点到单向链表 思路:当不考虑编号的顺序时 找到当前的链表的最后一个节点,将最后节点的next指向新的节点
*/
public void add(HeroNode heroNode) {
// 因为head头节点不能动,我们需要一个辅助遍历temp
HeroNode temp = head;
// 遍历链表,找到最后
while (true) {
// 找到的链表的最后
if (temp.next == null) {
break;
}
// 如果没找到最后,就将temp后移
temp = temp.next;
}
temp.next = heroNode;
}
显示出链表所有节点:
通过遍历的方法,最后一个节点的next是NULL
// 显示链表[遍历]
public void showList() {
// 判断链表是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
// 因为head头节点不能动,我们需要一个辅助遍历temp
HeroNode temp = head.next;
while (true) {
// 判断是否到链表最后
if (temp == null) {
break;
}
// 输出节点信息
System.out.println(temp.toString());
// 将temp后移,一定注意
temp = temp.next;
}
}
**注意这里还要重写方法toString,**不重写该方法会打印出
getClass().getName() + “@” +Integer.toHexString(hashCode());就是:类名 + @ +hashCode的值
注意重写tostring方法的时候,不应该打印出
// 为了显示方便,重写tostring
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
整个代码:
package com.suanfa;
public class SingleLinkedListDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 进行测试
// 先创建节点
HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");
HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
HeroNode hero3 = new HeroNode(3, "吴用", "智多星");
HeroNode hero4 = new HeroNode(4, "林冲", "豹子头");
// 创建链表
SingleLinkedList singleLinkedList = new SingleLinkedList();
// 加入
singleLinkedList.add(hero1);
singleLinkedList.add(hero2);
singleLinkedList.add(hero3);
singleLinkedList.add(hero4);
singleLinkedList.showList();
}
}
//定义SingleLinkedList 管理我们的英雄
class SingleLinkedList {
// 先初始化一个头结点,头节点不要动,且不存放具体数据
private HeroNode head = new HeroNode(0, "", "");
/*
* 函数:添加节点到单向链表 思路:当不考虑编号的顺序时 找到当前的链表的最后一个节点,将最后节点的next指向新的节点
*/
public void add(HeroNode heroNode) {
// 因为head头节点不能动,我们需要一个辅助遍历temp
HeroNode temp = head;
// 遍历链表,找到最后
while (true) {
// 找到的链表的最后
if (temp.next == null) {
break;
}
// 如果没找到最后,就将temp后移
temp = temp.next;
}
temp.next = heroNode;
}
// 显示链表[遍历]
public void showList() {
// 判断链表是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
// 因为head头节点不能动,我们需要一个辅助遍历temp
HeroNode temp = head.next;
while (true) {
// 判断是否到链表最后
if (temp == null) {
break;
}
// 输出节点信息
System.out.println(temp.toString());
// 将temp后移,一定注意
temp = temp.next;
}
}
}
//定义一个HereoNode
class HeroNode {
public int no;
public String name;
public String nickname;
public HeroNode next;// 指向下一节点
// 定义构造器
public HeroNode(int hNo, String Hname, String Hnickname) {
this.no = hNo;
this.name = Hname;
this.nickname = Hnickname;
}
// 为了显示方便,重写tostring
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}