一 创建一个单链表
1. 定义节点--------创建一个类,定义链表中所含的数据。构造方法、重写toString方法。
//定义节点
class HeroNode {
public int no;
public String name;
public HeroNode next;
public HeroNode(int no, String name, HeroNode next) {
this.no = no;
this.name = name;
this.next = next;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}
2. 定义管理节点的类--------初始化头结点,不存放具体的数据。编写方法对节点进行管理
- add()-------在尾结点添加节点
- addByO----rder按照no的顺序添加
- show()-----显示节点
- updata()----根据编号修改节点
- delete()------根据编号删除节点
//管理节点
class SingleLinkListed {
//初始化头结点,不存放具体的数据。
private HeroNode head = new HeroNode(0, "", null);
public HeroNode getHead() {
return head;
}
//在尾结点添加节点
public void add(HeroNode heroNode) {
HeroNode temp = head;
while (true) {
//找到最终的尾结点
if (temp.next == null) {
break;
}
//如果不为空,节点后移一个
temp = temp.next;
}
temp.next = heroNode;
}
//按照no的顺序添加
public void addByOrder(HeroNode heroNode) {
HeroNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no == heroNode.no) {
flag = true;
break;
}
if (temp.next.no > heroNode.no) {
break;
}
temp = temp.next;
}
if (flag == true) {
System.out.println("需要插入的数据存在");
return;
} else {
heroNode.next = temp.next;
temp.next = heroNode;
}
}
//根据no删除节点
public void delete(int no) {
if (head == null) {
System.out.println("链表为空链表。");
return;
}
HeroNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null)
break;
if (temp.next.no == no) {//此时temp为待删除节点的前一个节点
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
} else {
System.out.println("没有找到待删除的节点");
}
}
//显示节点
public void showlink() {
if (head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode temp = head;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
//根据编号修改节点
public void updata(HeroNode heroNode) {
if (head.next == null) {
System.out.println("链表为空");
return;
}
boolean flag = false;
HeroNode temp = head.next;
while (true) {
if (temp == null) {
break;//已遍历完链表
}
if (temp.no == heroNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.name = heroNode.name;
} else {
System.out.println("没有找到编号为" + heroNode.no + "的节点");
}
}
//求列表节点的个数
public int linkCount(HeroNode head) {
int count = 0;
HeroNode temp = head.next;
while (true) {
if (temp == null)
break;
count++;
temp = temp.next;
}
return count;
}
//找出倒数第l个节点
public void test1(int L, int l) {
int lenth = L - l;
HeroNode temp = head;
if (l > L) {
System.out.println("null");
return;
}
for (int i = 0; i <= lenth; i++) {
temp = temp.next;
}
System.out.println(temp.toString());
}
//翻转链表
/*
1.先定义一个节点,reverseNode
2.从头到尾遍历原来的链表,霉变粒一个节点,将其取出放在新单链表reverseNode 的最前面
3.将原来的链表的head指向reverseNode.next
*/
public void reverseLink(HeroNode head){
if (head.next==null||head.next.next==null){
System.out.println("链表为空链表或只有一个节点!");
return;
}
HeroNode temp=head.next;
HeroNode next = null;
HeroNode reverseNode = new HeroNode(0 ," ",null);
while (temp!=null){
next=temp.next; //保存当前节点的下一个节点,后面需要使用
temp.next= reverseNode.next;//将temp的下一个节点 指向新链表的最前方
reverseNode.next=temp;//将temp连接到新链表上
temp=next;//
}
head.next=reverseNode.next;
}
//链表逆序输出
public void reversePrint(HeroNode head){
if (head.next==null){
System.out.println("链表为空 ");
return;}
HeroNode temp = head.next;
Stack<HeroNode> es = new Stack<HeroNode>();
while (temp!=null){
es.push(temp);
temp=temp.next;
}
while (!es.empty()){
System.out.println(es.pop());
}
}
}
3 测试类
package LinkedList;
import java.util.Stack;
public class SingleLinkList {
public static void main(String[] args) {
//Test1 正常添加
// HeroNode heroNode1 = new HeroNode(1,"宋",null);
// HeroNode heroNode2 = new HeroNode(2,"li",null);
// HeroNode heroNode3 = new HeroNode(3,"wkk",null);
// HeroNode heroNode4 = new HeroNode(4,"xss",null);
// SingleLinkListed singleLinkListed = new SingleLinkListed();
// singleLinkListed.add(heroNode1);
// singleLinkListed.add(heroNode2);
// singleLinkListed.add(heroNode3);
// singleLinkListed.add(heroNode4);
// singleLinkListed.showlink();
//Test2 按照no添加
SingleLinkListed singleLinkListed2 = new SingleLinkListed();
HeroNode h1 = new HeroNode(1, "宋", null);
HeroNode h2 = new HeroNode(2, "li", null);
HeroNode h3 = new HeroNode(3, "wkk", null);
HeroNode h4 = new HeroNode(4, "xss", null);
HeroNode h5 = new HeroNode(5, "gfdgd", null);
singleLinkListed2.addByOrder(h2);
singleLinkListed2.addByOrder(h1);
singleLinkListed2.addByOrder(h3);
singleLinkListed2.addByOrder(h5);
singleLinkListed2.addByOrder(h4);
singleLinkListed2.showlink();
//测试按照no修改节点信息
System.out.println("**********************测试按照no修改节点信息****************************");
HeroNode heroNode = new HeroNode(5, "哈哈哈", null);
singleLinkListed2.updata(heroNode);
singleLinkListed2.showlink();
//测试根据no删除节点
System.out.println("**********************根据no删除节点****************************");
singleLinkListed2.delete(5);
singleLinkListed2.delete(1);
singleLinkListed2.showlink();
System.out.println("***************************查节点数***********************");
//查节点数
singleLinkListed2.showlink();
System.out.println(singleLinkListed2.linkCount(singleLinkListed2.getHead()));
SingleLinkListed singleLinkListed3 = new SingleLinkListed();
HeroNode h01 = new HeroNode(1, "我是一", null);
HeroNode h02 = new HeroNode(2, "我是二", null);
HeroNode h03 = new HeroNode(3, "我是三", null);
HeroNode h04 = new HeroNode(4, "我是四", null);
HeroNode h05 = new HeroNode(5, "我是五", null);
HeroNode h06 = new HeroNode(6, "我是六", null);
HeroNode h07 = new HeroNode(7, "我是七", null);
HeroNode h08 = new HeroNode(8, "我是八", null);
HeroNode h09 = new HeroNode(9, "我是九", null);
HeroNode h010 = new HeroNode(10, "我是十", null);
System.out.println("**********************查找单链表倒数第n个节点****************************");
// 问题一 : 查找单链表倒数第n个节点
singleLinkListed3.addByOrder(h02);
singleLinkListed3.addByOrder(h01);
singleLinkListed3.addByOrder(h03);
singleLinkListed3.addByOrder(h05);
singleLinkListed3.addByOrder(h04);
singleLinkListed3.addByOrder(h06);
singleLinkListed3.addByOrder(h07);
singleLinkListed3.addByOrder(h08);
singleLinkListed3.addByOrder(h09);
singleLinkListed3.addByOrder(h010);
singleLinkListed3.showlink();
System.out.println(singleLinkListed3.linkCount(singleLinkListed3.getHead()));
singleLinkListed3.test1(singleLinkListed3.linkCount(singleLinkListed3.getHead()), 11);
System.out.println("********************翻转单链表******************************");
//问题二 : 翻转单链表
// singleLinkListed3.reverseLink(singleLinkListed3.getHead());
// singleLinkListed3.showlink();
System.out.println("********************单链表逆序输出******************************");
//问题三: 逆序打印单链表
//思路:利用栈先进后出的特点,将各个节点压入栈中,再出栈就实现了逆序操作。
singleLinkListed3.reversePrint(singleLinkListed3.getHead());
}
}