链表
- 链表以节点的方式进行存储
- 链表节点包括 data(存放数据),next(存放下一节点的指针)
- 各个节点不一定是连续
- 链表分 有头节点的链表、没有头节点的链表
package com.zsx.structure.linkedlist;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class SingleLinkedListDemo {
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
HeroNode heroNode1 = new HeroNode(1, "A", "aa");
HeroNode heroNode2 = new HeroNode(2, "B", "bb");
HeroNode heroNode3 = new HeroNode(3, "C", "cc");
HeroNode heroNode4 = new HeroNode(5, "E", "ee");
HeroNode heroNode5 = new HeroNode(4, "D", "dd");
HeroNode heroNode6 = new HeroNode(4, "Z", "zz");
singleLinkedList.addByOrder(heroNode1);
singleLinkedList.addByOrder(heroNode2);
singleLinkedList.addByOrder(heroNode3);
singleLinkedList.addByOrder(heroNode4);
singleLinkedList.addByOrder(heroNode5);
singleLinkedList.addByOrder(heroNode5);
singleLinkedList.update(heroNode6);
singleLinkedList.delete(1);
singleLinkedList.show();
System.out.println(singleLinkedList.getCount());
System.out.println(singleLinkedList.getNode(4));
singleLinkedList.showByRevese();
}
}
class SingleLinkedList {
private HeroNode head = new HeroNode(0, "", "");
public void addLast(HeroNode heroNode) {
HeroNode tmp = head;
while (true) {
if (tmp.getNext() == null) {
break;
}
tmp = tmp.getNext();
}
tmp.setNext(heroNode);
}
public void update(HeroNode heroNode) {
if (head.getNext() == null) {
System.out.println("空");
return;
}
HeroNode tmp = head;
boolean flag = false;
while (true) {
if (tmp == null) {
break;
}
if (tmp.getNo() == heroNode.getNo()) {
flag = true;
break;
}
tmp = tmp.getNext();
}
if (flag) {
tmp.setName(heroNode.getName());
tmp.setNickName(heroNode.getNickName());
} else {
System.out.println("找不到");
}
}
public void delete(int no) {
if (head.getNext() == null) {
System.out.println("空");
return;
}
HeroNode tmp = head;
boolean flag = false;
while (true) {
if (tmp.getNext() == null) {
break;
}
if (tmp.getNext().getNo() == no) {
flag = true;
break;
}
tmp = tmp.getNext();
}
if (flag) {
tmp.setNext(tmp.getNext().getNext());
} else {
System.out.println("找不到");
}
}
public void addByOrder(HeroNode heroNode) {
HeroNode tmp = head;
boolean flag = false;
while (true) {
if (tmp.getNext() == null) {
break;
}
if (tmp.getNext().getNo() > heroNode.getNo()) {
break;
} else if (tmp.getNext().getNo() == heroNode.getNo()) {
flag = true;
}
tmp = tmp.getNext();
}
if (flag) {
System.out.println("已经存在相同编号:" + heroNode);
return;
}
HeroNode preNode = tmp.getNext();
heroNode.setNext(preNode);
tmp.setNext(heroNode);
}
public void show() {
System.out.println("-------------show--------------");
if (head.getNext() == null) {
return;
}
HeroNode tmp = head.getNext();
while (true) {
System.out.println(tmp);
if (tmp.getNext() == null) {
break;
}
tmp = tmp.getNext();
}
}
public int getCount() {
int count = 0;
HeroNode tmp = head.getNext();
while (tmp != null) {
count++;
tmp = tmp.getNext();
}
return count;
}
public HeroNode getNode(int k) {
int count = 0;
HeroNode tmp = head.getNext();
HeroNode result = null;
while (tmp != null) {
count++;
if (count == k) {
result = tmp;
break;
}
tmp = tmp.getNext();
}
return result;
}
public void reverse() {
HeroNode tmp = head.getNext();
List<HeroNode> list = new ArrayList();
while (tmp != null) {
list.add(tmp);
tmp = tmp.getNext();
}
HeroNode tmp1 = head;
int i = list.size() - 1;
list.get(0).setNext(null);
while (i >= 0) {
tmp1.setNext(list.get(i));
tmp1 = tmp1.getNext();
i--;
}
}
public void reverse1() {
HeroNode tmp = head.getNext();
HeroNode reverseNode = tmp.clone();
reverseNode.setNext(null);
while (tmp != null) {
if (tmp.getNext() == null) {
break;
}
HeroNode tmp1 = tmp.getNext().clone();
tmp1.setNext(reverseNode);
reverseNode = tmp1;
tmp = tmp.getNext();
}
head.setNext(reverseNode);
}
public void reverse2() {
if (head.getNext() == null || head.getNext().getNext() == null) {
return;
}
HeroNode cur = head.getNext();
HeroNode next = null;
HeroNode reverse = null;
while (cur != null) {
next = cur.getNext();
cur.setNext(reverse);
reverse = cur;
cur = next;
}
head.setNext(reverse);
}
public void showByRevese() {
System.out.println("反向遍历~~~~~~~~~~");
HeroNode cur = head.getNext();
Stack<HeroNode> stack = new Stack<>();
while (cur != null) {
stack.add(cur);
cur = cur.getNext();
}
while (true) {
if (!stack.isEmpty()) {
System.out.println(stack.pop());
}
}
}
public void add(HeroNode heroNodeHead){
}
}
class HeroNode implements Cloneable {
private int no;
private String name;
private String nickName;
private HeroNode next;
public HeroNode(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
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 getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public HeroNode getNext() {
return next;
}
public void setNext(HeroNode next) {
this.next = next;
}
@Override
protected HeroNode clone() {
try {
return (HeroNode) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}