数据结构与算法持续学习记录
第一节 java模拟单向链表实现
前言
在b站上看韩老师的数据结构与算法,我根据他的章节,凭记忆实现然后记录下来,代码可能有些许差异,若不清晰,上b站搜索数据结构与算法,第一的就是尚硅谷韩老师的讲解。
一、什么是单向链表
1.单向链表是一种有序的数据结构 2.逻辑上连续,内存上不连续。 3.链表是一个一个的节点连接而成的,像羊肉串一样,所以叫"链"表 4.链表包含两部分 data域 和 next 域 data存放数据 next存放下一个节点信息 若next 为null
二、代码实现
package linklist;
public class HeroLinkedListDemo {
public static void main(String[] args) {
HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
HeroNode heroNode2 = new HeroNode(5, "李逵", "黑旋风");
HeroNode heroNode3 = new HeroNode(3, "孙悟空", "美猴王");
HeroNode heroNode4 = new HeroNode(6, "猪八戒", "悟能");
HeroLinkedList list = new HeroLinkedList();
list.addHero(heroNode2);
list.addHero(heroNode1);
list.addHero(heroNode4);
list.addHero(heroNode3);
list.showList(list);
System.out.println("============修改节点之后===========");
HeroNode heroNode5 = new HeroNode(6, "猪八戒", "秀莲老公");
list.updateNode(heroNode5);
list.showList(list);
System.out.println("============删除6 1节点之后===========");
list.del(6);
list.del(1);
list.showList(list);
list.del(1);
}
}
/**
* 英雄链表
*/
class HeroLinkedList {
//单向列表头
private HeroNode headNode = new HeroNode(0, "", "");
/**
* 往链表中添加节点,按编号信息no 1 2 3 4 5 6 排列
* 思路:临时变量temp的next.no>要插入节点node.no node.next=temp.next temp.next=node
*
* @param node 节点信息
*/
public void addHero(HeroNode node) {
//临时变量用来检索 最后一个节点next信息为null的
HeroNode tempNode = this.headNode;
while (true) {
if (tempNode.next == null) {
tempNode.next = node;
break;
}
if (tempNode.next.no > node.no) {
node.next = tempNode.next;
tempNode.next = node;
break;
}
tempNode = tempNode.next;
}
}
/**
* 思路:利用临时变量找到 temp.no = node.no 即可 node的信息 set到 temp即可
*/
public void updateNode(HeroNode node) {
HeroNode temp = this.headNode;
while (true) {
if (temp.next == null) {
System.out.println("未找到对应节点");
break;
}
if (temp.next.getNo() == node.getNo()) {
temp.next.setName(node.getName());
temp.next.setNickName(node.getNickName());
break;
}
temp = temp.next;
}
}
/**
* 思路:利用临时变量temp 找到temp.next.no = no temp.next=temp.next.next 没有引用指向节点,jvm回收垃圾即可
* @param no 节点的编号
*/
public void del(int no){
HeroNode temp = this.headNode;
while (true){
if(temp.next == null){
System.out.println("未找到对应节点");
break;
}
if(temp.next.no == no){
temp.next = temp.next.next;
break;
}
temp = temp.next;
}
}
//展示链表
public void showList(HeroLinkedList list) {
HeroNode temp = this.headNode;
if (temp.next == null) {
System.out.println("链表中暂无英雄数据");
} else {
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
System.out.println(temp);
}
}
}
}
/**
* 英雄节点信息
*/
class HeroNode {
//编号
int no;
//英雄姓名
String name;
//英雄昵称
String nickName;
//下一个节点信息
HeroNode next;
public HeroNode(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public HeroNode getNext() {
return next;
}
public void setNext(HeroNode next) {
this.next = next;
}
public int getNo() {
return no;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}
总结
学习单向链表,关键理解 临时变量temp ,还有理解引用传递。有问题可以邮件给我 shanglimin888@163.com