单链表求节点个数,反转,逆序打印,合并两个有序的单链表

package demo1;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

import static demo1.SingleLinkdeList.*;

public class linkedlist {
    public static void main(String[] args) {
        //测试,先创建节点
        HeroNode hero1 = new HeroNode(1, "aa", "aaa");
        HeroNode hero2 = new HeroNode(2, "bb", "aaa");
        HeroNode hero3 = new HeroNode(3, "cc", "aaa");
        HeroNode hero4 = new HeroNode(4, "dd", "aaa");
        HeroNode hero9 = new HeroNode(5, "dd", "aaa");
        HeroNode hero6 = new HeroNode(41, "dd", "aaa");
        HeroNode hero7 = new HeroNode(23, "dd", "aaa");
        HeroNode hero8 = new HeroNode(55, "dd", "aaa");
        HeroNode hero11 = new HeroNode(11, "aa", "aaa");
        HeroNode hero21 = new HeroNode(21, "bb", "aaa");
        HeroNode hero31 = new HeroNode(13, "cc", "aaa");
        HeroNode hero41 = new HeroNode(411, "dd", "aaa");
        HeroNode hero91 = new HeroNode(51, "dd", "aaa");
        HeroNode hero61 = new HeroNode(411, "dd", "aaa");
        HeroNode hero71 = new HeroNode(213, "dd", "aaa");
        HeroNode hero81 = new HeroNode(515, "dd", "aaa");
        //创建链表
        SingleLinkdeList singlelinkdelist1 = new SingleLinkdeList();
        SingleLinkdeList singlelinkdelist2 = new SingleLinkdeList();
        /*singleLinkdeList.add(hero1);
        singleLinkdeList.add(hero2);
        singleLinkdeList.add(hero3);
        singleLinkdeList.add(hero4);*/
        singlelinkdelist1.addByOrder(hero1);
        singlelinkdelist1.addByOrder(hero4);
        singlelinkdelist1.addByOrder(hero2);
        singlelinkdelist1.addByOrder(hero3);
        singlelinkdelist1.addByOrder(hero9);
        singlelinkdelist1.addByOrder(hero6);
        singlelinkdelist2.addByOrder(hero11);
        singlelinkdelist2.addByOrder(hero41);
        singlelinkdelist2.addByOrder(hero21);
        singlelinkdelist2.addByOrder(hero31);
        singlelinkdelist2.addByOrder(hero91);
        singlelinkdelist2.addByOrder(hero61);
        System.out.println(singlelinkdelist1.getnum());
        singlelinkdelist1.daoshuget(singlelinkdelist1, 1);
        singlelinkdelist1.addByOrder(hero7);
        singlelinkdelist1.addByOrder(hero8);
        singlelinkdelist2.addByOrder(hero71);
        singlelinkdelist2.addByOrder(hero81);
        System.out.println(singlelinkdelist1.getnum());
        //singleLinkdeList.addByOrder(hero3);
        singlelinkdelist1.list();
        singlelinkdelist1.daoshuget(singlelinkdelist1, 7);
        singlelinkdelist1.daoshuget(singlelinkdelist1, 8);

        //修改
        HeroNode hero5 = new HeroNode(4, "ddd", "bbb");
        singlelinkdelist1.update(hero5);
        singlelinkdelist1.list();
        singlelinkdelist1.delete(1);
        singlelinkdelist1.delete(2);
        singlelinkdelist1.delete(4);
        singlelinkdelist1.delete(1);
        singlelinkdelist1.list();
        System.out.println(singlelinkdelist1.getnum());
        //reversetList(singlelinkdelist1.getHead());
        singlelinkdelist1.list();
        System.out.println("逆序打印");
        int k = singlelinkdelist1.getnum();
        reverselist(k, singlelinkdelist1.getHead());
        reverseStack(k, singlelinkdelist1.getHead());
        System.out.println("合并前l1:");
        singlelinkdelist1.list();
        System.out.println("合并前l2:");
        singlelinkdelist2.list();
        System.out.println("合并后:");
        ArrayList<HeroNode> a=hebin(singlelinkdelist1, singlelinkdelist2);
        for (int i = 0; i < a.size(); i++) {
            System.out.println(a.get(i));

        }
    }
    //定义Singlelinkedlist

}

class SingleLinkdeList {
    //初始化一个头节点,不要动,不存放具体数据
    private HeroNode head = new HeroNode(0, "", "");

    public HeroNode getHead() {//重要
        return head;
    }

    //添加节点到单向链表
    //不考虑编号顺序时,找到最后节点再将这个next指向新的节点
    public void add(HeroNode heroNode) {
        //因为head节点不能动,因此需要一个辅助变量temp
        HeroNode temp2 = head;
        //遍历链表,找到最后
        while (true) {
            if (temp2.next == null) {
                break;
            }
            //没找到就将temp后移
            temp2 = temp2.next;
        }
        //当循环结束时,temp指向链表最后
        temp2.next = heroNode;
    }

    //第二种添加方式
    public void addByOrder(HeroNode heroNode) {
        HeroNode temp = head;
        boolean flag = false;//标志添加的编号是否存在,默认为false
        while (true) {
            if (temp.next == null) {//说明temp已经在链表最后
                break;
            }
            if (temp.next.no > heroNode.no) {//位置找到,就在temp后面添加
                break;
            } else if (temp.next.no == heroNode.no) {//说明已存在
                flag = true;
                System.out.println(temp.next.no);
                System.out.println(heroNode.no);
                break;
            }
            temp = temp.next;//遍历
        }
        //判断flag
        if (flag) {
            System.out.println("已存在");
        } else {
            heroNode.next = temp.next;
            temp.next = heroNode;
        }
    }

    //修改节点信息
    public void update(HeroNode newHeroNode) {
        //判断为空
        if (head.next == null) {
            System.out.println("空");
            return;
        }
        HeroNode temp = head.next;//定义一个辅助变量
        boolean flag = false;
        while (true) {
            if (temp == null) {
                break;//遍历完
            }
            if (temp.next.no == newHeroNode.no) {
                flag = true;//找到
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.name = newHeroNode.name;
            temp.nickname = newHeroNode.nickname;

        } else {
            System.out.println("无此");
        }
    }

    //删除节点
    public void delete(int i) {
        HeroNode temp = head;//定义一个辅助变量(和上面修改方法不一样!!!)
        boolean flag = false;
        while (true) {
            if (temp.next == null) {
                //System.out.println("无此");
                break;//遍历完
            }
            if (temp.next.no == i) {
                flag = true;//找到
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.next = temp.next.next;//被删除的节点将不会有其他引用指向,被垃圾回收机制回收
        } else {
            System.out.println("无此");
        }
    }

    //求单链表有效节点个数
    public int getnum() {
        HeroNode temp = head.next;
        int k = 0;
        while (true) {
            if (temp == null) {
                break;
            }
            k++;
            temp = temp.next;
        }
        return k;
    }

    //倒数节点
    public void daoshuget(SingleLinkdeList singleLinkdeList, int k) {
        HeroNode temp = head;
        int a = singleLinkdeList.getnum();
        if (k > a) {
            System.out.println("不存在");
            return;
        }
        int b = a - k + 1;
        for (int i = 0; i < b; i++) {
            temp = temp.next;
        }
        System.out.println("先打印一遍");
        singleLinkdeList.list();
        System.out.println("倒数第" + k + "个节点内容是:" + temp.toString());
        return;
    }

    //单链表反转
    public static void reversetList(HeroNode head) {
        //HeroNode head=singleLinkdeList.getHead();
        if (head.next == null || head.next.next == null) {//若为空或者只有1个,无需反转,直接返回
            return;
        }
        //定义一个辅助指针(变量)帮助遍历原链表
        HeroNode cur = head.next;
        HeroNode next = null;//指向当前节点(cur)的下一个节点
        HeroNode reverseHead = new HeroNode(0, "", "");

        //遍历原链表
        while (cur != null) {
            next = cur.next;//先暂时保存当前节点的下一个节点
            cur.next = reverseHead.next;//将cur的下一个节点指向新的链表的最前端
            reverseHead.next = cur;//将cur连接到新的链表上
            cur = next;//让cur后移
        }
        //将head.next指向reverseHead.next
        head.next = reverseHead.next;
        return;
    }

    //逆序打印
    public static void reverselist(int k, HeroNode head) {
        if (head.next == null) {
            return;
        }
        for (int i1 = 0; i1 < k; i1++) {
            HeroNode temp = head;
            for (int i = k; i > i1; i--) {
                temp = temp.next;
            }
            System.out.println(temp);
        }
        return;
    }

    //栈逆序打印
    public static void reverseStack(int k, HeroNode head) {
        if (head.next == null) {
            return;
        }
        Stack<HeroNode> stack = new Stack();
        HeroNode temp = head;
        for (int i = 0; i < k; i++) {
            stack.add(temp.next);//入栈
            temp = temp.next;
        }
        while (stack.size() > 0) {
            System.out.println(stack.pop());//出栈
        }
        return;
    }

    //合并两个有序的单链表,合并后依然有序

    public static ArrayList<HeroNode> hebin(SingleLinkdeList s1, SingleLinkdeList s2) {
        ArrayList<HeroNode>a=new ArrayList<>();
        HeroNode temp1 = s1.getHead();
        HeroNode temp2 = s2.getHead();
        HeroNode next = null;
        HeroNode temp3 = new HeroNode(0, "", "");
        while ((temp1.next != null) || (temp2.next != null)) {
            if (temp1.next == null) {
                next = temp2.next.next;
                temp3.next = temp2.next;
                temp2.next = next;
                //temp3 = temp3.next;
            } else if (temp2.next == null) {
                next = temp1.next.next;
                temp3.next = temp1.next;
                temp1.next = next;
                //temp3 = temp3.next;
            } else {
                if (temp1.next.no < temp2.next.no) {
                    next = temp1.next.next;
                    temp3.next = temp1.next;
                    temp1.next = next;
                    //temp3 = temp3.next;
                } else {
                    next = temp2.next.next;
                    temp3.next = temp2.next;
                    temp2.next = next;
                    //temp3 = temp3.next;
                }
            }
            temp3 = temp3.next;
            System.out.println("temp3的值是:" + temp3);
            a.add(temp3);
            //s3.add(temp3);
        }
        return a;
    }

    //显示链表,遍历
    //通过一个辅助变量
    public void list() {
        if (head.next == null) {
            System.out.println("空");
            return;
        }
        HeroNode temp = head.next;
        while (true) {
            //判断是否到链表最后
            if (temp == null) {
                break;
            }
            //输出节点信息
            System.out.println(temp);
            //将temp后移
            temp = temp.next;
        }
    }
}

class HeroNode {
    public int no;
    public String name;
    public String nickname;
    public HeroNode next;//指向下一个节点

    public HeroNode() {
    }

    public HeroNode(int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        this.nickname = nickname;
        //this.next = next;
    }

    /**
     * 获取
     *
     * @return no
     */
    public int getNo() {
        return no;
    }

    /**
     * 设置
     *
     * @param no
     */
    public void setNo(int no) {
        this.no = no;
    }

    /**
     * 获取
     *
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     *
     * @return nickname
     */
    public String getNickname() {
        return nickname;
    }

    /**
     * 设置
     *
     * @param nickname
     */
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    /**
     * 获取
     *
     * @return next
     */
    public HeroNode getNext() {
        return next;
    }

    /**
     * 设置
     *
     * @param next
     */
    public void setNext(HeroNode next) {
        this.next = next;
    }

    public String toString() {
        return "HeroNode{no = " + no + ", name = " + name + ", nickname = " + nickname + "}";
    }
    //构造器

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值