栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

单链表相关操作【java】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

单链表相关操作【java】

单链表相关操作
  1. 单链表的创建、添加、修改、删除
  2. 常见面试题:
    1)求单链表中有效结点个数
    2)查找单链表中的倒数第k个结点
    3)单链表的反转
    4)从尾到头打印单链表
    5)合并两个有序链表
package com.atguigu.demomptest.linkedlist;

import java.util.Date;
import java.util.Stack;

import static com.atguigu.demomptest.linkedlist.SinglelinkedList.*;

public class SinglelinkedListDemo {
    public static void main(String[] args) {
        //进行测试
        //1.先创建结点
        HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");
        HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
        HeroNode hero3 = new HeroNode(3, "吴用", "智多星");
        HeroNode hero4 = new HeroNode(4, "林冲", "豹子头");

        HeroNode hero5 = new HeroNode(5, "a", "aa");
        HeroNode hero6 = new HeroNode(6, "b", "bb");
        HeroNode hero7 = new HeroNode(7, "c", "cc");
        HeroNode hero8 = new HeroNode(8, "d", "dd");

/*        // 修改前
        singlelinkedList.list();

        // 测试修改
        HeroNode heronode = new HeroNode(2, "小卢", "玉麒麟~~");
        singlelinkedList.update(heroNode);

        System.out.println("修改后的链表情况~");
        //显示
        singlelinkedList.list();*/
    public static int getLength(HeroNode head) {
        //定义辅助变量
        HeroNode curr = head.next;
        int length = 0;
        while (curr != null) {
            length++;
            curr = curr.next; //遍历
        }
        return length;
    }

    //查找单链表中的倒数第k个结点
    //思路
    //1.编写一个方法,接收head结点,同时接收一个index
    //2.index 表示倒数第index个结点
    //3.先把链表从头到尾遍历,得到链表的总长度getLength
    //4.得到size后,我们从链表的第一个开始遍历,遍历到size-index,就可以得到。
    //5.如果找到了,则返回该结点,否则返回null
    public static HeroNode findLastIndexNode(HeroNode head, int index) {
        //判断链表为空,返回null
        if (head.next == null) {
            return null;
        }
        //第一次遍历得到链表的长度(结点个数)
        int size = getLength(head);
        //第二次遍历,size-index位置,就是我们倒数第k个结点
        //先做一个index校验
        if (index <= 0 || index > size) {
            return null;
        }
        //定义辅助变量,for循环定位到倒数的index
        HeroNode temp = head.next;
        for (int i = 0; i < size - index; i++) { //目的是让指针后移
            temp = temp.next;
        }
        return temp;
    }

    //单链表反转
    //思路:头插法
    //1、先定义一个结点reverseHead=new Heronode()
    //2、从头到尾遍历原来的链表,每遍历一个结点,就将其取出,并放在新的链表的最前端
    //3、原来的链表head.next = reverseHead.next
    public static void reverseList(HeroNode head) {
        //如果当前链表为空,或者只有一个结点,无需反转,直接返回
        if (head.next == null || head.next.next == null) {
            return;
        }

        HeroNode reverseHead = new HeroNode(0, "", "");
        //遍历原来的链表
        //定义辅助变量cur
        HeroNode cur = head.next; // 从第一个有效结点开始
        HeroNode next = null; //指向当前结点的下一个结点
        while (cur != null) {
            next = cur.next; //每次都要先保存当前结点的下一个结点,否则原来的链表会断链,无法继续遍历下去
            // 将当前结点取出,并放在新链表的最前面
            cur.next = reverseHead.next;
            reverseHead.next = cur;
            cur = next;// 指针后移
        }
        //将head.next 指向reverseHead.next,实现链表反转
        head.next = reverseHead.next;
    }

    //从尾到头打印单链表
    //思路
    //方式一:先将单链表反转,然后再遍历。会破坏原来的单链表结构,不建议
    //方式二:可以利用栈。将各个结点压入栈中,然后利用栈后进先出的特点,实现逆序打印的效果

    public static void reversePrint(HeroNode head) {
        if (head.next == null) {
            return;
        }
        //创建一个栈,将各个结点压入栈
        Stack stack = new Stack<>();
        //定义辅助变量
        HeroNode cur = head.next;
        while (cur != null) {
            stack.push(cur); //入栈
            cur = cur.next;//指针后移,压入下一个结点
        }
        // 将栈中的结点pop
        while (stack.size()>0){
            System.out.println(stack.pop());
        }
    }

    //合并两个有序链表:思路和单链表反转类似
    public static void mergeList(HeroNode h1,HeroNode h2){
        System.out.println("进入了merge方法。h1.next="+h1.next);

        HeroNode cur1 = h1.next;
        HeroNode cur2 = h2.next;
        HeroNode next1=null;
        HeroNode next2=null;

        HeroNode mergeHead = new HeroNode(0,"","");
        HeroNode temp = mergeHead;

        System.out.println("cur1==null:::"+cur1==null);
        System.out.println("cur2==null:::"+cur2==null);
        while(true){
            if (cur1==null){
                temp.next=cur2;
                System.out.println("第一个单链表遍历完了,cur2:"+cur2+",cur2.next:"+cur2.next);
                break;
            }
            if (cur2==null){
                temp.next=cur1;
                System.out.println("第二个单链表遍历完了");
                break;
            }
            if (cur1.no
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/355939.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号