数据结构之单向链表

本文章主要介绍单向链表的一些面试题,链表相对于数组主要是在插入和删入上降低了时间复杂度,但对于单向链表来说,只能从头结点开始遍历到尾节点,无法实现从尾节点向头结点的遍历;下面则是一些对于单向链表常常考察的知识。


          1.初始化链表
          2.链表的销毁
          3.头部插入
          4.头部删除
          5.尾部插入
          6.尾部删除
          7.显示链表信息
          8.升序排列链表
          9.查找链表节点
         10.降序排列链表
         11.得到链表的数量
         12.合并两条升序链
         13.找到倒数第num个节点
         14.找到中间节点
         15逆置链表
         16.链表的拷贝
         17.判断两链表是否相交

         18.找到两链表的第一个交点
         19.删除一个节点
         20.判断链表是否有环
         21.找到环的入口

链表面试题的实现:

            首先创建list.h文件,该文件包括链表节点控制信息的结构体、链表节点结构体、链表接口的声明。在之前的编程过程中可能大多数人都没有想到使用节点控制信息的结构体,该结构体包括链表的头结点、链表的个数、链表的尾节点,有了这样的结构体大大方便了编程者对接口的实现。

        list.h中结构体的声明:

        链表的控制信息让我们清楚的知道链表的当前状态,大大提高了我们的编程效率。

链表接口的声明:



1.链表的初始化:

        初始化的工作主要是动态分配控制信息的内存,初始化节点的控制信息。

        其中使用到的Malloc为一个包裹函数,其具体的实现如下:

        bzero函数的功能主要是将申请的空间进行清零操作

2.链表的销毁

         销毁的主要工作是:将动态申请的内存进行回收,在destroy_list中其参数为list的二级指针(为防止内存的泄露必须传递二级指针)

         销毁的具体步骤:1.先销毁链表的节点  -> 2.再销毁控制信息  -> 3.  *list = NULL;


3.对于头部插入(push_front)、头部删除(pop_front)、尾部插入(push_back)、尾部删除(pop_back)的具体实现如下:

        头部插入(push_front):


        头部删除(pop_front)




            尾部插入(push_back):


            尾部删除(pop_back)

7.显示链表信息:

          使一个节点指针从头结点开始遍历到尾节点,并依次打印data的值。

8.升序排列链表:

         借鉴数组中对元素的排序,链表的节点不动,只是将其data域进行排列。

        通用的swap函数:

9.降序排列链表:

          其思路和升序一致。

10.查找链表节点:

          

11.得到链表数量:

           链表节点控制信息包含链表的数量,使得获取链表的数量变得很容易!!!


12.合并两条升序链:

13.找到倒数第num个节点:



14.找到链表的中间节点

15.逆置链表:

     

16.链表的拷贝:

17.判断两链表是否有交点:

           有交点则尾节点一定重合。

18.返回两链表相交的第一个交点

19.删除一个节点


20.判断链表是否有环

     第一种思路:使节点指针从head开始直到倒数第一个元素判断其是否与list ->tail ->next相等;

     第二种思路:使用快慢指针,快指针一次走两步,慢指针一次走一步,如果链表有环,快慢指针必定在环内相遇,

快慢指针:

21.找到环的入口:

            简化方法:


将问题转化为两链表相交的问题:




测试程序:
























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值