(7)设计 一 个算法,将链表中所有结点的链接方向“原地”逆转,即要求仅利
用原表的存储空间,换句话说,要求算法的空间复杂度为 O(1) 。
/*
(7)设计 一 个算法,将链表中所有结点的链接方向“原地”逆转,即要求仅利
用原表的存储空间,换句话说,要求算法的空间复杂度为 O(1) 。
*/
#include <stdio.h>
#include <iostream>
#define LENGTH 5
typedef struct LNode
{
int data;
struct LNode *next;
} LNode, *LinkList;
void CreatList_R(LinkList &L, int n)
{
L = new LNode;
L->next = NULL;
LNode *r = L;
for (int i = 0; i < n; i++)
{
LNode *p = new LNode;
printf("data%d:", i + 1);
std::cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
void ShowList(LinkList L)
{
LNode *p = L->next;
while (p)
{
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}
void Oo(LinkList &L)
{
LNode *p = L->next;
LNode *temp;
L->next = NULL; // 这一步一开始没注意,导致链表中的指针超级混乱,遍历的时候无限循环,搞得我好久才意识到;
while (p)
{
temp = p->next;
p->next = L->next;
L->next = p;
p = temp;
if (!p)
break;
}
}
int main(void)
{
LinkList L;
CreatList_R(L, LENGTH);
ShowList(L);
Oo(L);
ShowList(L);
delete L;
return 0;
}
如有错误,请告诉我;
如有更好的方法请告诉我;
谢谢。