C语言笔试题之重排链表

重排链表

实例要求

  • 1、给定一个单链表 L 的头节点 head ,单链表 L 表示为:
c 复制代码
L0 → L1 → ... → Ln - 1 → Ln
  • 2、请将其重新排列后变为:
c 复制代码
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → ...
  • 3、不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换;
  • 示例:

实例分析

  • 1、找到链表的中间节点,可以使用快慢指针法
  • 2、将链表分为两部分,前半部分和后半部分。
  • 3、将后半部分反转。
  • 4、将两个部分交替合并

示例代码

c 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
void reorderList(struct ListNode* head) {
    if (head == NULL || head->next == NULL || head->next->next == NULL) return;
    
    // 快慢指针找中间节点
    struct ListNode *slow = head;
    struct ListNode *fast = head;
    while (fast->next != NULL && fast->next->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
    }
    
    // 将链表分为两部分
    struct ListNode *secondHalf = slow->next;
    slow->next = NULL;
    
    // 反转后半部分链表
    struct ListNode *prev = NULL;
    struct ListNode *curr = secondHalf;
    struct ListNode *nextNode;
    while (curr != NULL) {
        nextNode = curr->next;
        curr->next = prev;
        prev = curr;
        curr = nextNode;
    }
    secondHalf = prev;
    
    // 合并两个部分
    struct ListNode *firstHalf = head;
    while (secondHalf != NULL) {
        struct ListNode *nextFirst = firstHalf->next;
        struct ListNode *nextSecond = secondHalf->next;
        
        firstHalf->next = secondHalf;
        secondHalf->next = nextFirst;
        
        firstHalf = nextFirst;
        secondHalf = nextSecond;
    }
}

运行结果


相关推荐
玖玥拾14 分钟前
C/C++ 基础笔记(十三)继承
c语言·c++·继承
z落落25 分钟前
C#WinForm 窗体切换与窗体传值(登录跳转案例)+WinForm 窗体传值(从上往下传、从下往上传)
开发语言·windows·c#
Dontla38 分钟前
git bash打开Claude code报错:Claude Code on Windows requires git-bash.(别把git装其他位置,严格按照默认安装)找不到claude code
windows·git·bash
comcoo2 小时前
电脑自动干活不用值守!OpenClaw 本地部署完整实操流程
windows·开源·github·open claw部署·open claw部署包
2601_961875242 小时前
法考资料2026|全套|资料已整理
数据结构·算法·链表·贪心算法·eclipse·线性回归·动态规划
蓝鸟19742 小时前
Windows Route 内外网双通原理+实战详解(彻底解决双网卡互斥断网)
windows·网络运维·电脑网络配置·路由冲突解决·route命令·内外网同时上网·windows路由 双网卡双通
2601_950526433 小时前
程序设计语言(C)
c语言·数据类型·实验教学·编译预处理·程序设计语言(c)
不会C语言的男孩3 小时前
Linux 系统编程 · 第 4 章:文件属性与元数据
linux·c语言·开发语言
C语言小火车3 小时前
什么时候用智能指针?什么时候用裸指针?
c语言·c++·学习·指针
2601_961845423 小时前
法考真题及答案解析|历年真题|资料已整理
linux·windows·ubuntu·macos·centos·gnu