“就地”的意思是辅助空间复杂度为O(1);
这个比较简单,最简单的思路就是拿下头结点,剩下的结点头插法插进去,因为头插法插入之后顺序就是逆序了。
王道上还提供了一种解法,是遍历链表,然后把指针反转。我看看把两个代码都实现一下试试。
#include<iostream>
using namespace std;
//----------------------此处生成一个链表,过程可以直接跳过------------
//结点结构
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *Linklist;
//带头结点单链表的创建
LNode* create(int Array[]){
LNode *p, *pre, *head;
head = new LNode;
head->data = NULL;
pre = head;
for (int i = 0; i < 5; i++){
p = new LNode;
p->data = Array[i];//链表的data域直接用数组的值传, 不直接输入了
p->next = NULL;
pre->next = p;
pre = p;
}
return head;
}
//-----------------------------------------------------------------
//从尾到头反向输出带头结点单链表每个结点的值(就地逆置)
//法一:摘掉头结点,剩余部分头插法插入
Linklist reverse01(Linklist L){
LNode *p, *r;
p = L->next;
L->next = NULL;
while (p!=NULL){
r=p->next;
p->next = L->next;
L->next = p;
p = r;
}
return L;
}
//法二:遍历链表,反转指针
Linklist reverse02(Linklist L){
LNode *pre, *p = L->next, *r = p->next;
p->next = NULL;
while (r != NULL){
pre = p;
p = r;
r = r->next;
p->next = pre;
}
L->next = p;
return L;
}
int main(){
int Array01[5] = { 1, 3, 5, 7, 9 };
LNode* L01 = create(Array01);
reverse01(L01);//此处逆置一次
reverse02(L01);//此处又逆置一次,最后输出序列不变
while (L01->next != NULL){
cout << L01->next->data;
L01 = L01->next;
}
cout << endl;
return 0;
}