//就地逆置链表
思路:采用类似于头插法,把头结点拿下来,然后原链表按顺序接到头结点之后。
note:两个指针*p和*r,p用来遍历,r用来记录p的后继,
#include<iostream>
using namespace std;
typedef struct lnode {
int data;
struct lnode* next;
}lnode,*linklist;
int a[5] = { 1,2,3,4,5 };
int n = 5;
void buildlist(linklist& L) {
L = (lnode*)malloc(sizeof(lnode));
if (L == NULL)return;
lnode* s, * r = L;
for (int i = 0; i < n; i++) {
s = (lnode*)malloc(sizeof(lnode));
s->data = a[i];
r->next = s;
r = r->next;
}
r->next = NULL;
}
void disp(linklist L) {
lnode* s = L->next;
while (s) {
cout << s->data << " ";
s = s->next;
}
cout << endl;
}
void reverse(linklist L) {
lnode* p = L->next, * r;
L->next = NULL;//头结点拿下来
while (p) {
r = p->next;
p->next = L->next;
L->next = p;
p = r;
}
}
int main()
{
linklist L;
buildlist(L);
disp(L);
reverse(L);
disp(L);
return 0;
}