单链表反转的思路
使用3个指针,分别指示当前节点,当前节点的前一个节点,以及后一个节点。初始化前一个节点为空。当节点个数大于1时,每遍历一个节点,更新它的next指针指向前一个节点。同时更新前一个节点和后一个节点。直至当前节点指针为空,返回前一个节点的指针。
代码
#include <iostream>
using namespace std;
struct Node {
int value;
Node *next;
Node() {
}
Node(int i):value(i),next(NULL){
}
};
void addNode(Node **list, int i) {
if (!list ||!*list) {
return;
}
Node *n = *list;
Node *cur = n;
Node *tailP = NULL;
while(cur) {
tailP = cur;
cur = cur->next;
}
Node *node = new Node(i);
tailP->next = node;
}
void printNode(Node *list) {
if (list) {
Node *c = list;
while(c) {
cout<<c->value;
c = c->next;
if (c) {
cout<<"; ";
}
}
cout<<endl;
}
}
Node *reverseList(Node *list) {
if (list && list->next) {
Node *prev = NULL;
Node *cur = list;
while(cur) {
Node *follow = cur->next;
cur->next = prev;
prev = cur;
cur = follow;
}
return prev;
}
return list;
}
int main() {
Node *head = new Node(1);
const int maxInt = 10;
for (int idx = 2;idx < maxInt;idx++) {
addNode(&head,idx);
}
cout<<"befor reverse:"<<endl;
printNode(head);
Node *reverseHead = reverseList(head);
cout<<"after reverse:"<<endl;
printNode(reverseHead);
return 0;
}
易错点
- 当前链表长度大于1时,才需要反转。
- 反转后的链表指针为指向前一个节点的指针。