//就地逆置链表
note:采用类似于头插法,把头结点拿下来,然后原链表按顺序接到头结点之后。
两个指针*p和*r,p用来遍历,r用来记录p的后继,
#includeusing 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; }



