当前位置: 首页 > article >正文

数据结构 【单链表练习】

        今天来探讨两个练习题要使用的思想为快慢指针。

        1、返回链表的中间节点

        给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

        整体思路如下图所示:

        代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* middleNode(struct ListNode* head) {
    struct ListNode* fast,*slow;
    fast = slow = head;

    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
    }

    return slow;
    
}

        2、返回链表中倒数第k个值

        实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

        整体思路如下:

        代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
int kthToLast(struct ListNode* head, int k) {
    struct ListNode* slow,*fast;
    slow = fast = head;

    while(--k)
    {
        fast = fast->next;
    }

    while(fast->next)
    {
        slow = slow->next;
        fast = fast->next;
    }

    return slow->val;
}

3、反转链表

        三指针逐个反转链表的指向,思路如下图所示:

        代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head) {
    if(head == NULL)
        return head;
    struct ListNode* n1,*n2,*n3;
    n1 = NULL;
    n2 = head;
    n3 = n2->next;

    while(n2)
    {
        if(n3 == NULL)
        {
            n2->next = n1;
            n1 = n2;
            n2 = n3;
            break;
        }
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        n3 = n3->next;
    }
    return n1;
}

方法2:顺序取出每一个节点,头插到新的链表中,思路如下:

        代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head) {
    if(head == NULL)
        return NULL;
    struct ListNode* newHead,*cur,*next;
    newHead = NULL;
    cur = head;
    next = cur->next;

    while(cur)
    {
        cur->next = newHead;

        newHead = cur;
        cur = next;
        if(next != NULL)
            next = next->next;


    }
    return newHead;
}

4、合并两个有序链表

        将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。思路如下图所示:

        代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    if(list1 == NULL)
    {
        return list2;
    }
    if(list2 == NULL)
    {
        return list1;
    }
    struct ListNode* head,*tail;
    head = tail = NULL;
    struct ListNode* cur1 = list1,*cur2 = list2;

    while(cur1 && cur2)
    {
        if(cur1->val <= cur2->val)
        {
            if(head == NULL)
            {
                head = cur1;
                tail = cur1;
            }
            else
            {
                tail->next = cur1;
                tail = tail->next;
            }
            cur1 = cur1->next;
        }else
        {
            if(head == NULL)
            {
                head = cur2;
                tail = cur2;
            }
            else
            {
                tail->next = cur2;
                tail = tail->next;
            }
            cur2 = cur2->next;
        }
    }

    if(cur1)
    {
        tail->next = cur1;
    }
    if(cur2)
    {
        tail->next = cur2;
    }
    return head;
}

 

        


http://www.kler.cn/a/401155.html

相关文章:

  • 如何通过统计来反映工业新产业发展情况
  • Qt的一个基本用户登录界面编写|| 从0搭建QT的信号与槽的应用案例 ||Qt样式表的应用
  • 详解Rust的数据类型和语法
  • Spark RDD 的 combineByKey、cogroup 和 compute 算子的作用
  • arkUI:网格布局(Grid)
  • DataStream编程模型之数据源、数据转换、数据输出
  • RPA真的是人工智能吗?
  • 二刷代码随想录第七天
  • git commit
  • 如何将几个音频合成一个音频?非常简单的几种合成方法
  • Pandas-5:数据分析与统计
  • MongoDB的常用命令(数据库操作、集合操作、文档操作)
  • CentOS 7.9 搭建本地Yum源
  • 汽车科技前沿:Spring Boot资讯快车道
  • 深入解析【C++多态】:探索面向对象编程中的动态绑定与行为多样性和多态的核心概念与应用实践
  • ubuntu24.04网卡配置
  • 大连理工大学概率上机作业免费下载
  • 嵌入式串口通信
  • 《网络风险及网络安全》培训总结
  • html5复习一
  • ospf实验
  • 【MYSQL】什么是关系型数据库与非关系型数据库?
  • Spring Boot图书馆管理系统:疫情中的管理利器
  • 【重生之我要苦学C语言】C语言内存函数
  • 面向服务的软件工程——面向过程的系统分析:流程挖掘(week10)
  • ssh隧道代理访问内网应用