用就地插解法实现链表逆序,且不可额外申请空间,就本人的理解来看,关键是要处理好个链表节点指针间的关系。用两个头结点指针,一个指向原链表,一个指向新的链表,初始化为NULL指针,再用一个指向下一个结点的临时指针,然后一个一个地将链表结点逆序即可。这里以int型的5个节点的链表为例进行说明,具体的操作如下:
具体的代码实现如下:
//不可额外申请空间
//就地插解法
#include<iostream>
struct ListNode {
int value;
ListNode* nextNode;
ListNode(int x):value(x),nextNode(NULL){ }
};
void printList(ListNode* head,const char *list_name) {
printf("%s:", list_name);
if (!head) {
printf("%NULL\n");
return;
}
while (head) {
printf("[%d] ", head->value);
head = head->nextNode;
}
printf("\n");
}
int main() {
ListNode a(1);
ListNode b(2);
ListNode c(3);
ListNode d(4);
ListNode e(5);
ListNode* head = &a;
a.nextNode = &b;
b.nextNode = &c;
c.nextNode = &d;
d.nextNode = &e;
e.nextNode = NULL;
printList(head, "new");
ListNode* newhead = NULL;
ListNode* temp;
while (head) {
temp = head->nextNode;
head->nextNode = newhead;
newhead = head;
head = temp;
}
printList(newhead, "old");
return 0;
}