数据结构逐日一题day14(链表)★★★★★

  论坛元老 | 2025-5-8 03:16:31 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1874|帖子 1874|积分 5622

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
标题描述:试编写算法将带头结点的单链表就地逆置,所谓“就地”就是空间复杂度为O(1)。

算法思想:

1.初始化:
定义三个指针 prev、curr、next,分别表示前驱节点、当前节点和后继节点。
prev 初始化为 NULL,curr 初始化为头结点的下一个节点(即第一个有效节点)。
2.遍历链表并反转:
遍历链表,每次将 curr->next 指向 prev,实现局部反转。
然后 prev、curr、next 依次后移,继续处理下一个节点。
3.修正头结点指针:
遍历结束后,prev 指向原链表的最后一个节点,即新链表的第一个节点。
将头结点的 next 指向 prev,完成整个链表的逆置。

复杂度分析:
时间复杂度:O(n)
空间复杂度:O(1)

代码实现:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Node {
  4.     int data;
  5.     struct Node *next;
  6. } Node, *LinkedList;
  7. // 创建链表(尾插法)
  8. LinkedList createList() {
  9.     LinkedList L = (Node*)malloc(sizeof(Node)), tail = L;
  10.     int x;
  11.     while (scanf("%d", &x), x != -1) {
  12.         tail->next = (Node*)malloc(sizeof(Node));
  13.         tail = tail->next;
  14.         tail->data = x;
  15.     }
  16.     tail->next = NULL;
  17.     return L;
  18. }
  19. // 就地逆置链表
  20. void reverseList(LinkedList L) {
  21.     if (L == NULL || L->next == NULL) {
  22.         return; // 空链表或仅头结点,无需逆置
  23.     }
  24.     Node *prev = NULL;
  25.     Node *curr = L->next; // 第一个有效节点
  26.     Node *next = NULL;
  27.     while (curr != NULL) {
  28.         next = curr->next; // 保存下一个节点
  29.         curr->next = prev; // 反转当前节点的指针
  30.         prev = curr;       // prev 后移
  31.         curr = next;       // curr 后移
  32.     }
  33.     L->next = prev; // 头结点指向新的第一个节点
  34. }
  35. // 打印链表
  36. void printList(LinkedList L) {
  37.     for (Node *p = L->next; p; p = p->next) {
  38.         printf("%d ", p->data);
  39.     }
  40.     puts("");
  41. }
  42. int main() {
  43.     LinkedList L = createList();
  44.     printf("原链表: ");
  45.     printList(L);
  46.     reverseList(L);
  47.     printf("逆置后: ");
  48.     printList(L);
  49.     return 0;
  50. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表