Valar morghulis392 2023-12-18 16:22 采纳率: 66.7%
浏览 5
已结题

问一个关于c语言的小问题

img


请问这个子函数有什么问题呢?期待的功能是把链表的前m个结点挪到最后.为什么没有输出呢?

  • 写回答

1条回答 默认 最新

  • 抑郁的代码男孩 2023-12-18 17:38
    关注

    模拟过程如下:

    img

    img

    建议
    前m个结点视为一个整体移动,而不是一个节点一个节点的移动,容易出错
    还有针对单链表的插入删除元素,最好在表头前添加一个哑节点,方便在表头位置增删元素

    /*
    ** 定义哑节点
    */
    NODE* dummy = (NODE*)malloc(sizeof(NODE));
    dummy->next = head;
    
    /*
    ** 找到表尾
    */
    NODE* tail = head;
    while (tail->next != NULL) {
        tail = tail->next;
    }
    
    /*
    ** 移动到第m个节点,从表头节点开始需要走m - 1次
    */
    NODE* p = head;
    for (int i = 1; i < m; ++i) {
        p = p->next;
    }
    
    head = p->next;             // 前m个节点移到表尾,则第m + 1个节点就是新的表头,即p->next 
    p->next = NULL;             // 第m个节点应该是新表尾,即p 
    tail->next = dummy->next;  // 前m个节点链接到旧表尾节点 
    dummy->next = head;        // 将新的表头节点链接到哑节点上 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月26日
  • 已采纳回答 12月18日
  • 创建了问题 12月18日

悬赏问题

  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题
  • ¥20 基于matlab的航迹融合 航迹关联 航迹插补
  • ¥15 用Matlab实现图中的光线追迹