//真让人头大,这题debug了一个点。。。
typedef struct Node *PtrToNode;
struct Node {
int Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
List Reverse(List L) {
PtrToNode p1, p2, p3;
if (L == NULL) return NULL;
p1 = L;
if (p1->Next == NULL) return L;
else if (p1->Next->Next == NULL) {
p2 = p1->Next;
p2->Next = p1;
p1->Next = NULL;
return p2;
}
else {
p2 = p1->Next;
p3 = p2->Next;
}
while (p3 != NULL) {
if(p1 == L) p1->Next = NULL;
p2->Next = p1;
p1 = p2;
p2 = p3;
p3 = p3->Next;
}
p2->Next = p1;
return p2;
}
List Reverse(List L) {
List p1, p2, p3;
if (L == NULL || L->Next == NULL) return L;
else if (L->Next->Next == NULL) {
p2 = L->Next;
p2->Next = L;
L->Next = NULL;
}
else {
p1 = L;
p2 = p1->Next;
p3 = p2->Next;
p1->Next = NULL;
while (p3 != NULL) {
p2->Next = p1;
p1 = p2;
p2 = p3;
p3 = p3->Next;
}
p2->Next = p1;
}
return p2;
}
void Print(List L) {
List p = L;
while (p != NULL) {
printf("%d ", p->Data);
p = p->Next;
}
puts("");
}
List Read() {
int n;
scanf("%d", &n);
if (!n) return NULL;
List head, p1, p2;
head = (List)malloc(sizeof(struct Node));
p1 = head;
//printf("head = %p\n", head);
for(int i = 0; i < n; ++i) {
//printf("p = %p\n", p1);
int x;
scanf("%d", &x);
p1->Data = x;
p1->Next = (List)malloc(sizeof(struct Node));
p2 = p1;
p1 = p1->Next;
}
//p1 = NULL; p1 = NULL不代表privious的next = null嗷嗷嗷
p2->Next = NULL;
return head;
}
int main() {
#ifdef _DEBUG
//IN(); OUT();
#endif
List L1, L2;
L1 = Read();
Print(L1);
L2 = Reverse(L1);
Print(L1);
Print(L2);
return 0;
}
4-1 单链表逆转
最新推荐文章于 2024-04-01 19:25:08 发布