【剑指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