【数据结构】单链表面试题讲解->贰

这篇具有很好参考价值的文章主要介绍了【数据结构】单链表面试题讲解->贰。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌏引言

单链表的操作算法是笔试面试中较为常见的题目。
本文将着重介绍平时面试中常见的关于链表的应用题目,马上要进行秋招了。希望对你们有帮助 _😀
【数据结构】单链表面试题讲解->贰,数据结构,数据结构,链表,java,合并链表,链表分割

🍀合并两个有序链表

🎄题目描述

将两个升序链表合并为一个新的 升序 链表并返回。

新链表是通过拼接给定的两个链表的所有节点组成的。

🎋示例:

【数据结构】单链表面试题讲解->贰,数据结构,数据结构,链表,java,合并链表,链表分割

🎍解法思路

🚩建立虚拟节点

建立一个虚拟节点为newList;

建立虚拟节点的目的:

  • 既然需要合并那么肯定是需要一个头节点
  • 由于两个链表的头节点谁大谁小不知道,所以建立虚拟节点
  • 小的就与虚拟节点相连
  • 【数据结构】单链表面试题讲解->贰,数据结构,数据结构,链表,java,合并链表,链表分割
  • 最后返回newList.next;

🚩tmp的建立

虚拟节点不便移动,需要记录当前位置,最后返回newList.next;

那我们就需要一个指针可以向后移动,连接list1与list2比较的较小值

🚩进行合并

合并思想:

  • 对list1与list2里的元素进行比较
  • 谁小就与tmp连接,然后小的list向后走一步成为新的list1,tmp向后走一步成为新的tmp
  • 依次类推进行比较
  • 比如list1的值小,就将list1与tmp相连
  • 然后list1与tmp各自向后走一步
  • 【数据结构】单链表面试题讲解->贰,数据结构,数据结构,链表,java,合并链表,链表分割

结束条件:当list1为null或者list2wei空时

代码实现如下:

 while(list1 != null && list2 != null) {
            if(list1.val < list2.val) {
                tmp.next = list1;
                tmp = tmp.next;
                list1 = list1.next;
            } else {
                tmp.next = list2;
                tmp = tmp.next;
                list2 = list2.next;
            }
        }

🚩链表为空

链表为空分为两种种i情况

一个链表为空

  • 只需要将另一个链表连接在tmp后面就好

两个都为空

  • 其实上述将另一链表连接在tmp就可以解决
  • 如果连接链表为null,返回的自然也就是null

🌳完整代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
         ListNode newList = new ListNode();
        ListNode tmp = newList;
        while(list1 != null && list2 != null) {
            if(list1.val < list2.val) {
                tmp.next = list1;
                tmp = tmp.next;
                list1 = list1.next;
            } else {
                tmp.next = list2;
                tmp = tmp.next;
                list2 = list2.next;
            }
        }
        if(list1 == null) {
            tmp.next = list2;
        }
        if(list2 == null) {
            tmp.next = list1;
        }
        return newList.next;
    }
}

🍀链表分割

🎄题目描述

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前

且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        // write code here
    }
}

🎍示例:

【数据结构】单链表面试题讲解->贰,数据结构,数据结构,链表,java,合并链表,链表分割

🎋思路解析:

🚩链表拆分

将该链表拆分为两个链表;

  • 链表a用于存储小于x的数
  • 链表b用于存储大于x的数

最后将链表b拼接在链表a后面,返回a链表的头指针即可

🚩链表a的建立

创建a1为a链表的头指针,a2为a链表最后一个节点的指针

建立过程:

  • 对所需要分割的链表进行遍历

  • 对每一个节点的元素大小进行判断,如果小于x就进入该链表

  • 进入后对我们的a1进行判断,判断a1当前是否为null

  • 如果为null,将当前的pHead赋给a1和a2;

  • 【数据结构】单链表面试题讲解->贰,数据结构,数据结构,链表,java,合并链表,链表分割

  • 如果不为null,将当前的pHead赋给a2.next,a2向后走一步

  • 【数据结构】单链表面试题讲解->贰,数据结构,数据结构,链表,java,合并链表,链表分割

代码实现如下:

if (a1 == null) {
	a1 = pHead;
	a2 = pHead;
} else {
	a2.next = pHead;
	a2 = a2.next;
}

🚩链表b的建立

创建a1为a链表的头指针,a2为a链表最后一个节点的指针

创建过程与链表a同理

代码实现如下:

if (b1 == null) {
	b1 = pHead;
	b2 = pHead;
} else {
	b2.next = pHead;
	b2 = b2.next;
}

🚩链表的合并

情况考虑:

  • 链表a为null或者两者都为null
  • 这时候只需要返回b1就可以了;
  • 当a链表不为空时,b链表为空时
  • 将b1赋给a2.next,进行合并
  • 当a链表不为null时,b链表也不为null
  • b1赋给a2.next,进行合并
  • 将b2.next置为null,作为尾节点;

代码实现如下:

 	if (a1 == null) {
            return b1;
        }
        a2.next = b1;
        if (b1 != null) {
            b2.next = null;
        }
        return a1;

🌳完整代码实现

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        // write code here
        ListNode a1 = null;
        ListNode a2 = null;
        ListNode b1 = null;
        ListNode b2 = null;
        while (pHead != null) {
            if (pHead.val < x) {
                if (a1 == null) {
                    a1 = pHead;
                    a2 = pHead;
                } else {
                    a2.next = pHead;
                    a2 = a2.next;
                }
            } else {
                if (b1 == null) {
                    b1 = pHead;
                    b2 = b1;
                } else {
                    b2.next = pHead;
                    b2 = b2.next;
                }
            }
            pHead = pHead.next;
        }
        if (a1 == null) {
            return b1;
        }
        a2.next = b1;
        if (b1 != null) {
            b2.next = null;
        }
        return a1;
    }
}

⭕总结

关于《【数据结构】单链表面试题讲解->贰》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!文章来源地址https://www.toymoban.com/news/detail-664411.html

到了这里,关于【数据结构】单链表面试题讲解->贰的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构练习】链表面试题集锦一

    目录 前言: 1. 删除链表中所有值为key的节点  方法一:正常删除,头结点另外讨论  方法二:虚拟头结点法  方法三:递归 2.反转链表  方法一:双指针迭代   方法二:递归法 3.链表的中间结点   方法:快慢指针法 4. 链表中倒数第k个结点  方法:快慢指针方法 5.合并两个

    2024年02月11日
    浏览(39)
  • 数据结构-链表-单链表(3)

    目录 1. 顺序表的缺陷 2. 单链表 2.1 单链表的基本结构与接口函数 2.2 重要接口 创建新节点的函数: 2.2.1 尾插 2.2.2 头插 2.2.3 尾删 2.2.4 头删 2.2.5 查找 2.2.6 插入 2.2.7 删除 2.2.8 从pos后面插入 2.2.9 从pos后面删除 3. 链表的缺陷与优势: 4. 链表与顺序表比较 写在最后: 为什么

    2024年01月17日
    浏览(110)
  • [数据结构]链表之单链表(详解)

    在学习 链表 之前,我们已经学习了 顺序表 了 根据 顺序表 的特点,我们可以发现 顺序表 有优点,也有一些缺陷。 所以根据 顺序表 的缺点,链表就横空出世啦~ **概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次

    2023年04月08日
    浏览(56)
  • 【数据结构】- 链表之单链表(下)

    未来藏在迷雾中 叫人看来胆怯 带你踏足其中 就会云开雾散 本章是关于数据结构中的链表之单链表(下) 提示:以下是本篇文章正文内容,下面案例可供参考 1.2.1 在pos位置插入(也就是pos位置之前) 流程图 多个节点 一个节点 1.2.2 在pos位置之后插入 流程图: 注意: 下面这种写

    2023年04月23日
    浏览(63)
  • 【数据结构】-- 单链表 vs 双向链表

    🌈 个人主页: 白子寰 🔥 分类专栏: python从入门到精通,魔法指针,进阶C++,C语言,C语言题集,C语言实现游戏 👈 希望得到您的订阅和支持~ 💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)  目录  单链表和

    2024年04月17日
    浏览(47)
  • <数据结构> 链表 - 单链表(c语言实现)

    哨兵位结点也叫哑节点。哨兵位结点 也是头结点 。该节点 不存储有效数据,只是为了方便操作 (如尾插时用带哨兵位的头结点很爽,不需要判空)。 有哨兵位结点的链表,第一个元素应该是链表第二个节点(head - next,head为哨兵位结点)对应的元素。 有哨兵位结点的链表

    2023年04月11日
    浏览(135)
  • 数据结构入门 — 链表详解_单链表

    数据结构入门 — 单链表详解 * 博客主页链接:https://blog.csdn.net/m0_74014525 关注博主,后期持续更新系列文章 文章末尾有源码 *****感谢观看,希望对你有所帮助***** 第一篇:数据结构入门 — 链表详解_单链表 第二篇:数据结构入门 — 链表详解_双向链表 第三篇:数据结构入门

    2024年02月11日
    浏览(55)
  • 【数据结构】反转链表、链表的中间节点、链表的回文结构(单链表OJ题)

    正如标题所说,本文会图文详细解析三道单链表OJ题,分别为:  反转链表 (简单)  链表的中间节点 (简单)  链表的回文结构 (较难) 把他们放在一起讲的原因是:  反转链表 和  链表的中间节点 是  链表的回文结构 的基础 为什么这样说?请往下看: 目录 1. 反转链

    2024年02月13日
    浏览(72)
  • 【数据结构】单链表 | 详细讲解

    无须为了表示中间的元素之间的逻辑关系而增加额外的存储空间; 因为以数组形式存储,可以快速地存取表中任一位置的元素。 插入和删除操作需要移动大量元素,时间复杂度为O(N); 当线性表长度变化较大时,难以确定存储空间的容量; 造成存储空间的“碎片”。 其实顺

    2024年02月05日
    浏览(48)
  • 【数据结构】 链表简介与单链表的实现

    在【数据结构】 ArrayList简介与实战中我们已经熟悉了ArrayList的使用,并且进行了简单模拟实现。通过源码知道,ArrayList底层使用数组来存储元素 由于其底层是一段连续空间, 当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为

    2024年02月12日
    浏览(203)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包