韩顺平2019-Java数据结构
学习韩顺平老师的Java数据结构
构建单向链表与双向列表
代码里包括一下内容
单向链表
1.增(链表最后节点增,和根据id排序增),删,改,查
2.获取倒数地index的节点
3.获取列表长度
4.列表逆序以及列表逆序输出(不改变链表的原有节点)
5.合并两个有序单链表(用到递归)—课后作业
双向链表
增(链表最后节点增,和根据id排序增),删,改,查
1.定义节点
package com.second.week;
/**
* 〈一句话功能简述〉<br>
* 〈英雄〉
*
* @author PitterWang
* @create 2019/11/30
* @since 1.0.0
*/
public class HeroNode {
int no;
String name;
String nikeName;
HeroNode nextHeroNode;
HeroNode preHeroNode;
public HeroNode(int no, String name, String nikeName) {
this.no = no;
this.name = name;
this.nikeName = nikeName;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nikeName='" + nikeName + '\'' +
'}';
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNikeName() {
return nikeName;
}
public void setNikeName(String nikeName) {
this.nikeName = nikeName;
}
public HeroNode getNextHeroNode() {
return nextHeroNode;
}
public void setNextHeroNode(HeroNode nextHeroNode) {
this.nextHeroNode = nextHeroNode;
}
public HeroNode getPreHeroNode() {
return preHeroNode;
}
public void setPreHeroNode(HeroNode preHeroNode) {
this.preHeroNode = preHeroNode;
}
}
2.构建单向链表
package com.second.week;
import java.util.Stack;
/**
* 〈单向链表〉<br>
* 〈〉
*
* @author PitterWang
* @create 2019/11/30
* @since 1.0.0
*/
public class SingleLinkedList {
//初始化头节点
private HeroNode head = new HeroNode(0, "", "");
public HeroNode getHeroNode(){
return this.head;
}
//添加(在最后节点添加)
public void add(HeroNode newHeroNode){
HeroNode temp = head;
while (true){
if(temp.nextHeroNode == null){
break;
}
temp = temp.nextHeroNode;
}
temp.nextHeroNode = newHeroNode;
}
public void addOrderBy(HeroNode newHeroNode){
HeroNode temp = head;
boolean isAdd = true;
while (true){
if(temp.nextHeroNode == null){
break;
}
if (temp.nextHeroNode.no > newHeroNode.no){
break;
}else if(temp.nextHeroNode.no == newHeroNode.no){
isAdd = false;
break;
}
temp = temp.nextHeroNode;
}
if(isAdd){
newHeroNode.nextHeroNode = temp.nextHeroNode;
temp.nextHeroNode = newHeroNode;
}else{
System.out.println("已存在不能添加");
}
}
public void update(HeroNode newHeroNode){
HeroNode temp = head;
if(temp.nextHeroNode == null){
System.out.println("空链表");
}
boolean isUpdate = false;
while (true){
if(temp == null){
break;
}
if (temp.no == newHeroNode.no){
isUpdate = true;
break;
}
temp = temp.nextHeroNode;
}
if(isUpdate){
temp.name = newHeroNode.name;
temp.nikeName = newHeroNode.nikeName;
}else{
System.out.println("不存在");
}
}
public void delete(int no){
HeroNode temp = head;
if(temp.nextHeroNode == null){
System.out.println("空链表");
}
boolean isDelete = false;
while (true){
if(temp.nextHeroNode == null){
break;
}
if (temp.nextHeroNode.no == no){
isDelete = true;
break;
}
temp = temp.nextHeroNode;
}
if(isDelete){
temp.nextHeroNode = temp.nextHeroNode.nextHeroNode;
}else{
System.out.println("不存在");
}
}
public void list(){
if(head.nextHeroNode == null){
System.out.println("空");
return;
}
HeroNode temp = head.nextHeroNode;
while (true){
if(temp == null){
break;
}
System.out.println(temp);
temp = temp.nextHeroNode;
}
}
/**
* 获取列表长度
* @return
*/
public int size(){
if(head.nextHeroNode == null){
System.out.println("空");
return 0;
}
HeroNode temp = head.nextHeroNode;
int lenth = 0;
while (true){
if(temp == null){
break;
}
temp = temp.nextHeroNode;
lenth ++ ;
}
return lenth;
}
/**
* 获取倒数地index的节点
* @param index
* @return
*/
public HeroNode findLastIndexNode(int index){
if(head.nextHeroNode == null){
return null;
}
int size = this.size();
if(index <= 0 || index > size){
return null;
}
HeroNode temp = head.nextHeroNode;
for (int i = 0 ; i < size - index ; i ++){
temp = temp.nextHeroNode;
}
return temp;
}
/***
* 列表逆序
* @return
*/
public HeroNode revererNode(){
HeroNode revererNode = new HeroNode(0, "", "");
if(head.nextHeroNode == null || head.nextHeroNode.nextHeroNode == null){
return head;
}
HeroNode temp = head.nextHeroNode;
HeroNode next = null; //指向cur的下一个节点
while (temp != null){
next = temp.nextHeroNode;
temp.nextHeroNode = revererNode.nextHeroNode;
revererNode.nextHeroNode = temp;
temp = next;
}
head.nextHeroNode = revererNode.nextHeroNode;
return head;
}
public void reversePrint(){
if(head.nextHeroNode == null){
return;
}
Stack<HeroNode> stack = new Stack<HeroNode>();
HeroNode temp = head.nextHeroNode;
while (temp != null){
stack.add(temp);
temp = temp.nextHeroNode;
}
while (stack.size() > 0){
System.out.println(stack.pop());
}
}
/***
* 合并两个有序单链表(用到递归)
* @param a
* @param b
* @return
*/
public HeroNode mergeList(HeroNode a,HeroNode b) {
HeroNode result = null;
if (a == null) {
return b;
}
if (b == null) {
return a;
}
if (a.getNo() <= b.getNo()) {
result = a;
result.setNextHeroNode(mergeList(a.getNextHeroNode(), b));
} else {
result = b;
result.setNextHeroNode(mergeList(a, b.getNextHeroNode()));
}
return result;
}
}
3.构建双向链表
package com.second.week;
/**
* 〈一句话功能简述〉<br>
* 〈双向列表〉
*
* @author PitterWang
* @create 2019/11/30
* @since 1.0.0
*/
public class DoubleLindedList {
//初始化头节点
private HeroNode head = new HeroNode(0, "", "");
//添加(在最后节点添加)
public void add(HeroNode newHeroNode){
HeroNode temp = head;
while (true){
if(temp.nextHeroNode == null){
break;
}
temp = temp.nextHeroNode;
}
temp.nextHeroNode = newHeroNode;
newHeroNode.preHeroNode = temp;
}
public void addOrderBy(HeroNode newHeroNode){
HeroNode temp = head;
boolean isAdd = true;
while (true){
if(temp.nextHeroNode == null){
break;
}
if (temp.nextHeroNode.no > newHeroNode.no){
break;
}else if(temp.nextHeroNode.no == newHeroNode.no){
isAdd = false;
break;
}
temp = temp.nextHeroNode;
}
if(isAdd){
newHeroNode.preHeroNode = temp;
newHeroNode.nextHeroNode = temp.nextHeroNode;
if(temp.nextHeroNode != null){
temp.nextHeroNode.preHeroNode = newHeroNode;
}
temp.nextHeroNode = newHeroNode;
}else{
System.out.println("已存在不能添加");
}
}
public void update(HeroNode newHeroNode) {
HeroNode temp = head;
if(temp.nextHeroNode == null){
System.out.println("空链表");
}
boolean isUpdate = false;
while (true){
if(temp == null){
break;
}
if (temp.no == newHeroNode.no){
isUpdate = true;
break;
}
temp = temp.nextHeroNode;
}
if(isUpdate){
temp.name = newHeroNode.name;
temp.nikeName = newHeroNode.nikeName;
}else{
System.out.println("不存在");
}
}
public void delete(int no){
HeroNode temp = head.nextHeroNode;
if(temp == null){
System.out.println("空链表");
}
boolean isDelete = false;
while (true){
if(temp == null){
break;
}
if (temp.no == no){
isDelete = true;
break;
}
temp = temp.nextHeroNode;
}
if(isDelete){
if(temp.nextHeroNode != null){
temp.nextHeroNode.preHeroNode = temp.preHeroNode;
}
temp.preHeroNode.nextHeroNode = temp.nextHeroNode;
}else{
System.out.println("不存在");
}
}
public void list(){
if(head.nextHeroNode == null){
System.out.println("空");
return;
}
HeroNode temp = head.nextHeroNode;
while (true){
if(temp == null){
break;
}
System.out.println(temp);
temp = temp.nextHeroNode;
}
}
}
4.测试类
package com.second.week;
/**
* 〈一句话功能简述〉<br>
* 〈〉
*
* @author PitterWang
* @create 2019/11/30
* @since 1.0.0
*/
public class LinkListdDemo {
public static void main(String[] args) {
HeroNode heroNode1 = new HeroNode(1,"小王","PJ");
HeroNode heroNode3 = new HeroNode(3,"小张","HQ");
HeroNode heroNode2 = new HeroNode(2,"小李","DD");
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addOrderBy(heroNode1);
singleLinkedList.addOrderBy(heroNode3);
singleLinkedList.addOrderBy(heroNode2);
singleLinkedList.list();
System.out.println("有效个数节点个数=" + singleLinkedList.size());
HeroNode heroNode4= new HeroNode(1,"小王","PJ");
HeroNode heroNode5 = new HeroNode(4,"小刘","HQ");
HeroNode heroNode6 = new HeroNode(5,"小狗","DD");
SingleLinkedList singleLinkedList2 = new SingleLinkedList();
singleLinkedList2.addOrderBy(heroNode4);
singleLinkedList2.addOrderBy(heroNode5);
singleLinkedList2.addOrderBy(heroNode6);
singleLinkedList2.list();
System.out.println("有效个数节点个数=" + singleLinkedList2.size());
SingleLinkedList s = new SingleLinkedList();
HeroNode heroNode = s.mergeList(singleLinkedList.getHeroNode(),singleLinkedList2.getHeroNode());
s.add(heroNode);
s.list();
/*HeroNode newHero = new HeroNode(2,"小赵","ZZ");
singleLinkedList.update(newHero);
System.out.println("修改后-------");
System.out.println("有效个数节点个数=" + singleLinkedList.size());
singleLinkedList.list();*/
/*
singleLinkedList.delete(1);
System.out.println("删除后-------");
singleLinkedList.list();
System.out.println("有效个数节点个数=" + singleLinkedList.size());
HeroNode heroNode = singleLinkedList.findLastIndexNode(2);
System.out.println(heroNode);*/
/* System.out.println("---------------");
singleLinkedList.revererNode();
singleLinkedList.list();*/
/*singleLinkedList.reversePrint();*/
/*
DoubleLindedList doubleLindedList = new DoubleLindedList();
doubleLindedList.addOrderBy(heroNode1);
doubleLindedList.addOrderBy(heroNode3);
doubleLindedList.addOrderBy(heroNode2);
doubleLindedList.list();
*/
/* System.out.println("更新------------");
HeroNode newHero = new HeroNode(2,"小赵","ZZ");
doubleLindedList.update(newHero);
doubleLindedList.list();
System.out.println("删除------------");
doubleLindedList.delete(3);
doubleLindedList.list();
*/
}
}
github 源码地址:自学数据结构源码地址