本文参考了:http://blog.csdn.net/heyabo/article/details/7610732
7 typedef struct Node {
8 int data;
9 struct Node *next;
10 }man,*MAN;
/***链表反转**/
法一:
思路:
1、先不考虑将头结点后移的问题,首先将所有的结点反转(包括头结点):
该步骤需要用到三个指针:
pre:指向第前一个结点;pcur:指向当前结点:pnext:指向当前结点的下一个结点
当1做完后,pre指向最后一个结点;
2、需要处理头结点和尾结点的问题
对于处理尾结点,我用到了一个变化一次的指针:q(用于指向在操作1还没操作的时候,指向头结点后的第一个结点,其目的是为了处理p->next = NULL)
对于处理头结点,将pre(操作1完了之后)放到头结点的next中:(*L)->next= pre;
83 int reversal_list(MAN *L)
84 {
85 MAN pre = *L,q;
86 MAN pcur = pre->next;
87 MAN pnext = NULL;
88
89 if ((NULL == pre) || (NULL == pre->next)) return ERROR;
90
91 q = pcur;
92 while (NULL != pcur)
93 {
94 pnext = pcur->next;
95 pcur->next = pre;
96 pre = pcur;
97 pcur = pnext;
98 }
99
100 q->next = NULL;
101 (*L)->next = pre;
102
103 return OK; //ok是我定义的宏为0 ,error为-1
104 }