这里的思路是双指针
让pcurrent的指向由前向后变为由后向前,这样就可以指出来
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef struct Node {
int date;
struct Node* next;
}Node;
void foreach(Node* head);
void convert(Node* head)
{
Node* per = NULL;
Node* pcurrent = head->next;//这里值得注意,如果一开始指向头节点的话,最后会造成死循环,因为反转过后pcurren->next并不是NULL,造成死循环
Node* prear;
while (pcurrent)
{
prear = pcurrent->next;//这里注意的顺序,1.prear=curren->next,因为后面的指针并没赋初值
pcurrent->next = per;//然后让当前指针下一个指向为之前的指针
per = pcurrent;
pcurrent = prear;
}
head->next = per;//这里也得注意,不加这步只是将链表转置了一下
foreach(head);
}
void foreach(Node* head)
{
Node* p = head;
while (p)
{
p = p->next;
printf("%d\n", p->date);
}
}
void Init(Node* head) {
int val = 0;
Node* p = head;
while (true)
{
printf("请输入各个节点的值:\n");
scanf("%d", &val);
if (val == -1)
break;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->next = NULL;
newNode->date = val;
p->next = newNode;
p = newNode;
}
convert(head);
}
int main() {
Node* head = (Node*)malloc(sizeof(Node));
head->next = NULL;
head->date = -3;
Init(head);
}