韩顺平 数据结构与算法(3)单链表

3 单链表
1) 链表介绍(Linked List)
  1. 链表是以节点的方式来存储
  2. 每个节点包含data域next域(表示指向的下一个节点地址)
  3. 如下图:发现链表的各个节点不一定是连续存储
  4. 链表分为带头节点的链表没有头节点的链表,根据实际需求确定
如图:
1. 单链表的实际存储结构

请添加图片描述

2. 单链表的逻辑存储模型

3) 单链表的创建
1.方法一:直接添加在尾部
  1. 先创建一个head头节点,作用表示单链表的头

  2. 后面每添加一个节点,就直接加入到链表的最后

  3. 遍历:

    通过一个辅助遍历,帮助遍历整个链表

2.方法二:根据(英雄)的排名插入
  1. 首先找到新添加的节点的位置(通过辅助变量)->通过遍历找到

  2. 新的节点的.next = temp.next

  3. 将temp.next = 新的节点

    Ps其实就两步走,第一步,将新节点的next变成temp.next;第二步,将temp.next指向新的节点,而不是原本的节点,因为原本temp.next的节点由新节点指向了

代码实现——链表的增删改查
package DataStructures.SingleLinkedList;

import javafx.scene.shape.StrokeLineCap;

import java.util.Stack;
import java.util.function.DoubleToIntFunction;

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

        //创建链表
        SingleLinkedList singleLinkedList = new SingleLinkedList();

         //直接在队尾添加
//        singleLinkedList.add(hero1);
//        singleLinkedList.add(hero2);
//        singleLinkedList.add(hero3);
//        singleLinkedList.add(hero4);

        //按照编号顺序添加
        singleLinkedList.addByOrder(hero1);
        singleLinkedList.addByOrder(hero4);
        singleLinkedList.addByOrder(hero2);
        singleLinkedList.addByOrder(hero3);

        //修改前
        System.out.println("修改前的链表情况~~");
        singleLinkedList.list();
        //修改节点的代码
        HeroNode newHeroNode =new HeroNode(2,"小卢","玉麒麟~~");
        singleLinkedList.update(newHeroNode);
        //修改后
        System.out.println("修改后的链表情况~~");
        singleLinkedList.list();

        //查找目标节点
        singleLinkedList.find(2);

        //删除前
        System.out.println("删除前的链表情况~~");
        singleLinkedList.list();
        // 删除一个节点
        singleLinkedList.del(3);
        //删除后
        System.out.println("修改后的链表情况~~");
        singleLinkedList.list();

        //测试一下单链表中的有效节点的个数
        System.out.println("有效的节点个数:"+ gerLength(singleLinkedList.getHead()));

        //测试一下 看看是否得到倒数第K个节点
        HeroNode res = findLastIndexNode(singleLinkedList.getHead(),4);
        System.out.println("res="+res);

        //测试一下单链表的反转功能
        System.out.println("原来链表的情况~~");
        singleLinkedList.list();
//        System.out.println("反转后单链表~~");
//        reversetList(singleLinkedList.getHead());
//        singleLinkedList.list();

        System.out.println("测试逆序打印单链表~~");//没有改变链表的原结构变化
        reversePrint(singleLinkedList.getHead());
    }

    // 逆序打印【百度面试题】
    //思路:
    //方式一:先将链表反转,然后遍历——>缺点是会破坏单链表的结构,不建议
    //方式二: 利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的效果
    //Ps:演示栈的应用转——》TestStack
    //使用方式二来实现逆序打印
    public static void reversePrint(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值