第一次交换
第二次交换
第三次交换
步骤:
- 定义当前结点 current,初始值为首元结点,current = L->next;
- 定义当前结点的后继结点 pnext, pnext = current->next;
- 只要 pnext 存在,就执行以下循环:
- 定义新节点 prev,它是 pnext的后继结点,prev = pnext->next;
- 把pnext的后继指向current, pnext->next = current;
- 此时,pnext 实际上已经到了 current 前一位成为新的current,所以这个时候 current 结点实际上成为新的 pnext,current = pnext;
- 此时,新的 current 就是 pnext,current = pnext;
- 而新的 pnext 就是 prev,pnext = prev;
- 最后将头结点与 current 重新连上即可,L->next = current;
函数设计如下:
02 |
Status ListReverse(LinkList L) |
04 |
LinkList current,pnext,prev; |
05 |
if (L == NULL || L->next == NULL) |
08 |
pnext = current->next; |
13 |
pnext->next = current; |
16 |
printf ( "交换后:current = %d,next = %d \n" ,current->data,current->next->data); |
01 |
Status ListReverse2(LinkList L) |
10 |
while (current->next != NULL) |
13 |
current->next = p->next; |
- p = current->next; p 就相当于前面的 pnext。(图1中a2即为p)
- current->next = p->next; p->next 就相当于 prev的角色,这句代码意思是 current 的后继指向 prev.(相当于图1中a1->next = a3(a2->next))
- p->next = L->next; 这句就是 p 的后继直接指向首元节点。(相当于图1中a2->next = a1)
- L->next = p; 然后再将头结点指向 p。(相当于图1中L->next = a2)
这个是程序运行的结果。
03 |
-> 68 -> 55 -> 18 -> 45 -> 41 -> 43 -> 5 -> 28 -> 80 -> 67 |
06 |
-> 55 -> 68 -> 18 -> 45 -> 41 -> 43 -> 5 -> 28 -> 80 -> 67 |
08 |
-> 18 -> 55 -> 68 -> 45 -> 41 -> 43 -> 5 -> 28 -> 80 -> 67 |
10 |
-> 45 -> 18 -> 55 -> 68 -> 41 -> 43 -> 5 -> 28 -> 80 -> 67 |
12 |
-> 41 -> 45 -> 18 -> 55 -> 68 -> 43 -> 5 -> 28 -> 80 -> 67 |
14 |
-> 43 -> 41 -> 45 -> 18 -> 55 -> 68 -> 5 -> 28 -> 80 -> 67 |
16 |
-> 5 -> 43 -> 41 -> 45 -> 18 -> 55 -> 68 -> 28 -> 80 -> 67 |
18 |
-> 28 -> 5 -> 43 -> 41 -> 45 -> 18 -> 55 -> 68 -> 80 -> 67 |
20 |
-> 80 -> 28 -> 5 -> 43 -> 41 -> 45 -> 18 -> 55 -> 68 -> 67 |
22 |
-> 67 -> 80 -> 28 -> 5 -> 43 -> 41 -> 45 -> 18 -> 55 -> 68 |
26 |
-> 67 -> 80 -> 28 -> 5 -> 43 -> 41 -> 45 -> 18 -> 55 -> 68 |
最后附上完整代码,反转有两个函数。
- 方法1,current始终保持在第一位,pnext与prev遍历并完成交换。
- 方法2,current始终是原链表的第一个数,然后把pnext不断移动到首位。
View Code
有两个方法可以实现单链表的反转:
方法一:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef struct Node
5 {
6 int data;
7 struct Node *next;
8 }Node;
9 Node *head,*p;
10
11 Node * ReverseLink(Node *head)
12 {
13 Node *p1, *p2, *p3;
14 if(head==NULL || head->next==NULL)
15 return head;
16 p1=head, p2=p1->next;
17 while(p2)
18 {
19 p3=p2->next;
20 p2->next=p1;
21 p1=p2;
22 p2=p3;
23 }
24 head->next=NULL;
25 head=p1;
26 return head;
27 }
28
29 void CreateList(int n)
30 {
31 Node *q;
32 int i;
33 printf("Input %2d data: ",n);
34 head=(Node *)malloc(sizeof(Node));
35 q=head;
36 scanf("%d",&q->data);
37 for(i=2;i<=n;i++)
38 {
39 q->next=(Node *)malloc(sizeof(Node));
40 q=q->next;
41 scanf("%d",&q->data);
42 }
43 q->next=NULL;
44 }
45
46 void PrintList()
47 {
48 Node *q;
49 q=head;
50 while (q!=NULL)
51 {
52 printf("%-8d",q->data);
53 q=q->next;
54 }
55 printf("\n");
56 }
57
58 void main()
59 {
60 CreateList(5);
61 PrintList();
62 head=ReverseLink(head);
63 PrintList();
64 }
方法二:
1 #include <iostream>
2 #include <assert.h>
3 using namespace std;
4
5 struct LNode{
6 char data;
7 LNode * next;
8 };
9
10 LNode * initList()
11 {
12 LNode *head=new LNode;
13 LNode *curPtr, *newPtr;
14 curPtr=head;
15 int i=0;
16 char ch='A';
17 while(i++<10)
18 {
19 newPtr=new LNode;
20 newPtr->data=ch++;
21 curPtr->next=newPtr;
22 curPtr=newPtr;
23 }
24 newPtr->next=NULL;
25 return head;
26 }
27
28 void print(LNode *head)
29 {
30 LNode *ptr=head->next;
31 while(ptr != NULL)
32 {
33 cout << ptr->data << " ";
34 ptr=ptr->next;
35 }
36 cout << endl;
37 }
38
39 void reverse(LNode *head)
40 {
41 assert(head != NULL && head->next != NULL);
42 LNode *ptr=head->next->next;
43 head->next->next=NULL;
44 while(ptr != NULL)
45 {
46 LNode *tmp=ptr->next;
47 ptr->next=head->next;
48 head->next=ptr;
49 ptr=tmp;
50 }
51 }
52
53 int main()
54 {
55 LNode *head=initList();
56 print(head);
57 cout << "After reverse: " << endl;
58 reverse(head);
59 print(head);
60 system("PAUSE");
61 return 0;
62 }
参考:http://www.cnblogs.com/heyonggang/p/3304838.html
http://www.nowamagic.net/librarys/veda/detail/2241
http://blog.csdn.net/hyg0811/article/details/11113623
本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3304838.html,如需转载请自行联系原作者