链表反转有两种常见方式。下面从图中详细解释。其中带有部分核心代码,最后上完整代码。
迭代法
//首先定义三个变量
PNODE pre = NULL;
PNODE now = pHead->pNext;
PNODE next = NULL;
next = now->pNext;//先保存下一个节点
now->pNext = pre;//当前节点的next指针指向前一个节点
pre = now;//前一个节点赋值为当前节点
now = next;//当前节点赋值为下一个节点
递归法
//一直递归直到找到尾节点
if(pHead == NULL || pHead->pNext == NULL)
return pHead;
pHead->pNext->pNext = pHead;//让当前节点的下一个节点的指针指向当前节点
pHead->pNext = NULL;//让当前节点的下一个节点指向NULL
再来一步
全部代码
/** *反转链表 **/ #include <cstdio> #include <cstdlib> #include <iostream> using namespace std; typedef struct Node{ int data;//数据域 struct Node* pNext;//指针域 }NODE, *PNODE;//NODE等价于struct Node,PNODE等价于struct Node* //打印链表所有元素 void print_list(PNODE pHead) { pHead = pHead->pNext; while(pHead != NULL) { cout<<pHead->data<<" "; pHead = pHead->pNext; } cout<<endl; return; } //创建链表 PNODE create_list() { PNODE pHead = (PNODE)malloc(sizeof(NODE)); PNODE pNow = pHead; for(int i=1; i<=5; i++) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); pNew->data = i; pNow->pNext = pNew; pNow = pNew; } pNow->pNext = NULL; return pHead; } //迭代反转链表 void reverse_list(PNODE pHead) { //首先定义三个变量 PNODE pre = NULL; PNODE now = pHead->pNext; PNODE next = NULL; //反转 while(now != NULL) { next = now->pNext;//先保存下一个节点 now->pNext = pre;//当前节点的next指针指向前一个节点 pre = now;//前一个节点赋值为当前节点 now = next;//当前节点赋值为下一个节点 } //最后把头结点指向新生成链表的头 pHead->pNext = pre; return; } //递归反转链表 PNODE reverse_list2(PNODE pHead) { //一直递归直到找到尾节点 if(pHead == NULL || pHead->pNext == NULL) return pHead; PNODE pNew = reverse_list2(pHead->pNext);//返回的永远都是尾节点 pHead->pNext->pNext = pHead;//让当前节点的下一个节点的指针指向当前节点 pHead->pNext = NULL;//让当前节点的下一个节点指向NULL //返回的是原来链表的尾节点,也就是新链表的首节点 return pNew; } int main() { PNODE pHead = NULL; pHead = create_list(); print_list(pHead); cout<<"迭代反转链表之后"<<endl; reverse_list(pHead); print_list(pHead); cout<<"递归反转链表之后"<<endl; pHead->pNext = reverse_list2(pHead->pNext); print_list(pHead); return 0; }
时间: 2024-10-11 22:58:56