翻转链表
思路:
(1)从头结点开始,p=L->next,然后从p开始,依次翻转p与p的前一个节点的指针的方向。
(2)提前记录p的next节点,因为指针变换后不会再指向下一个。
(3)令p的next指向p前面的节点。
(4)记录当前p指针,为下一次改变指针方向做准备。
(5)考虑头结点的情况,如果指针p的前一个节点是头结点,则指向NULL。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; struct Node{ int data; struct Node* next; }; typedef struct Node* List; List CreateList() { List L=(List)malloc(sizeof(struct Node)); L->next=NULL; return L; } void Insert(int x,List L,List p) { List tp=(List)malloc(sizeof(struct Node)); tp->data=x; tp->next=p->next; p->next=tp; } void Reverse(List L) { List tp,p=L->next,pre; while(p!=NULL) { tp=p->next; if(p==L->next) p->next=NULL; else p->next=pre; pre=p; p=tp; } L->next=pre; } void Print(List L) { List p=L->next; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } int main(void) { int n,i,x; List L=CreateList(),p; p=L; cin>>n; for(i=0;i<n;i++) { cin>>x; Insert(x,L,p); p=p->next; } Print(L); Reverse(L); Print(L); return 0; }