【剑指offer 面试题16】反转链表

思路:

  用三个指针preNode、curNode、nextNode完成。

 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct ListNode
 5 {
 6     int val;
 7     ListNode *next;
 8     ListNode(int v = 0):val(v), next(NULL){}
 9 };
10 
11 ListNode* reverseList(ListNode **pListhead)
12 {
13     //条件不加也不会出错,突出边界测试的想法
14     if(*pListhead == NULL)
15         return NULL;
16     if((*pListhead)->next == NULL)
17         return *pListhead;
18 
19     ListNode *preNode = NULL;
20     ListNode *curNode = *pListhead;
21     ListNode *reverseHead = NULL;
22 
23     while(curNode != NULL)
24     {
25         ListNode *nextNode = curNode->next;
26 
27         if(nextNode == NULL)
28         {
29             reverseHead = curNode;
30         }
31 
32         curNode->next = preNode;
33 
34         preNode = curNode;
35         curNode = nextNode;
36     }
37 
38     return reverseHead;
39 }
40 
41 int main()
42 {
43     ListNode *head = new ListNode(0);
44     ListNode *phead = head;
45 
46     for(int i = 1; i < 10; i++)
47     {
48         ListNode *temp = new ListNode(i);
49         phead->next = temp;
50         phead = phead->next;
51     }
52 
53     cout<<"原始链表: ";
54     ListNode *print = head;
55     while(print != NULL)
56     {
57         cout<<print->val<<" ";
58         print = print->next;
59     }
60     cout<<endl;
61 
62     cout<<"反转链表: ";
63     ListNode *rehead = reverseList(&head);
64     while(rehead != NULL)
65     {
66         cout<<rehead->val<<" ";
67         rehead = rehead->next;
68     }
69 }

测试结果:
原始链表: 0 1 2 3 4 5 6 7 8 9
反转链表: 9 8 7 6 5 4 3 2 1 0

 

 

posted @ 2015-06-21 15:47  tjuloading  阅读(143)  评论(0)    收藏  举报