单链表反转可用迭代法,也可用递归方法,这里用迭代法(循环)实现。
示意图如下,其中pre指前一个节点,cur指当前节点,temp为临时节点。
主要思路就是让当前节点指向前一个节点,即cur->next=pre,需要事前将cur->next赋值给temp。然后下移即可。
#include <stdio.h> typedef struct node_s { int item; struct node_s* next; }node_t,*link; //新建节点 link newNode(int item) { link new = malloc(sizeof(node_t)); new->item = item; new->next = NULL; return new; } link Reverse(link header){ if (header == NULL || header->next == NULL) { return header;} link pre; //前一个 link cur; //当前 link temp;//临时变量 pre = header; cur = header->next; pre->next = NULL; while (cur != NULL) { temp = cur->next; //temp暂存 cur->next = pre; //cur指向后面实现逆序 pre = cur; //pre后移 cur = temp; //cur后移 } return pre; } void printLink(node_t* header){ while (header != NULL){ if (header->next != NULL){ printf("%d->", header->item); //不是最后一个 } else{ printf("%d", header->item); } header = header->next; } printf(" "); } int main(int argc, char* argv[]){ //创建单向链接 node_t *header = NULL, *cur = NULL; for (int i = 1; i <= 3; ++i) { node_t* new = newNode(i); if (header == NULL){ header = new; } else{ cur->next = new; //加到后面 } cur = new; } printLink(header); //打印链表 auto newHeader = Reverse(header); //auto关键字,只用在赋值语句中 printLink(newHeader); system("pause"); }