目录
一、链表存储方式
- 用一组任意的存储单元存储信息,存储单元可以连续也可以不连续。信息之间是一对一的关系。
- 各个节点之间构成链表。
- 节点由数据域和指针域构成。
- 数据域存储数据,指针域存放下一个节点的地址。next 域实质为Node对象
- 链表由带头节点的和不带头节点的。下图为带节点的
二、创建节点类Node
每一个Node 类对象就是一个节点。
class Node{
public String name;//数据域
public String nickname;//数据域
public int node;//数据域
public Node next;//指针域
public Node(String name, String nickname, int node) {
this.name = name;
this.nickname = nickname;
this.node = node;
}
//重写toString()方法
@Override
public String toString() {
return "Node [name=" + name + ", nickname=" + nickname + ", node=" + node + "]";
}
三、重写 toString( ) 方法
为什么要重写 toString() 方法?每个类都从Object 类继承了 toString () 方法,并且返回的是一个内存地址。重写 toString() 方法,可以打印类中的信息。
例:创建一个people 类,类中有 age,name,nickname 三个成员变量。重写toString() 方法,可以返回类中age, name ,nickname 的信息。
package day_04;
//在没有重新toString()方法时,如果打印对象,则打印的是地址
//如果重写该方法,则打印的是该对象的信息public class ToString {
public static void main(String[] args) {
Teacher teacher = new Teacher(20,"huahua");
teacher.print(teacher);
}
}class Teacher{
private int age;
private String name;
public Teacher(int age, String name) {
super();
this.age = age;
this.name = name;
}@Override
public String toString() {
return "Teacher [age=" + age + ", name=" + name + "]";
}public void print(Teacher a) {
System.out.print(a);
}}
}
四、创建链表类用来管理节点
-
创建链表类
//创建链表类用来管理链表
class LinkedList{
//初始化头节点
Node head = new Node("","",0);
}
-
有顺序添加节点
//向链表中有顺序添加节点
/*
* 思路:遍历,找到需要添加的节点所在位置
* 创建中间变量
* 结束条件为:temp.next.node > newNode.node
* 如果编号已经存在,则提示编号已经存在
* 需要改变的条件为newNode.next = temp.next;temp.next = newNode
*/
public void addByOrder(Node newNode){
Node temp = head;
boolean flag = false;//编号是否存在
while(true) {
if(temp.next.node>newNode.node) {
break;
}
if(temp.next.node==newNode.node) {
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
System.out.println("编号已经存在");
}else {
newNode.next = temp.next;
temp.next = newNode;
}
}
-
删除相应位置节点
//删除对应位置的节点
/*
* 思路:遍历链表,找到对应位置的节点
* 创建中间变量temp,
* 条件为:temp.next.node = newNode.node
* 修改后的条件为:temp.next = temp.next.next
*
*/
public void del(Node newNode) {
if(head.next == null) {
System.out.println("链表为空,无法删除");
return;
}
Node temp = head;
boolean flag = false;
while(true) {
if(temp.next == null) {
break;
}
if(temp.next.node == newNode.node) {
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
//此时已经找到对应位置
temp.next = temp.next.next;
}else {
System.out.println("没有找到链表信息");
}
}
-
显示链表信息
//显示链表信息
/*
* 遍历链表,创建中间变量temp
* 遍历完的条件为temp == null
*/
public void show() {
if(head.next == null) {
System.out.println("链表为空");
return;
}
Node temp = head.next;//从第一个开始
while(true) {
if(temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
-
查找单链表中第k个节点
/*
* 思路分析:count-k为所查找节点前一个节点位置,则后一个位置即为所求位置
* 当temp.next不为null时,遍历,创建一个计数器,当计数器为count-k时,
* 说明到达
* temp.next即为对应节点
*/
public void search(int k) {
Node temp = head.next;
int num = 0;
boolean flag = false;
while(temp.next!=null) {
num++;
if(num==(count()-k)) {
flag = true;
break;
}
temp = temp.next;
}
System.out.println(temp.next);
}
- 求单链表中节点个数
/*
* 思路分析:若链表为空,则返回0,若不为空,则temp = head.next
* 定义一个count计数,每次count+1,temp= temp.next,直到temp==null
*/
public int count() {
if(head.next == null) {
return 0;
}
Hero temp = head;
int count = 0;
while(true) {
if(temp.next == null) {
break;
}
count++;
temp = temp.next;
}
return count;
}