一 创建一个单链表

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. 定义管理节点的类--------初始化头结点,不存放具体的数据。编写方法对节点进行管理

  1. add()-------在尾结点添加节点
  2. addByO----rder按照no的顺序添加
  3. show()-----显示节点
  4. updata()----根据编号修改节点
  5. 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());


      





    }

}