Reverse Linked List

在leetcode上看到了一道很常见的面试题,反转单链表。想着随便写写肯定就能过,没想到踩了很多坑,往往面试中就是因为这些边界条件没处理好而被拒绝。

首先要建一个空节点用来存反转后的结尾,否则会形成循环链表,运行超时。其次cur指针指向链表的结尾的最后一个元素时,要记得反转。可以在cur改变前反转一次,cur改变后反转一次,即一次循环里两次反转,或者在循环结束后处理最后一个节点。总之就是要特别处理好头和尾的问题,还有指针越界的问题。

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* reverseList(ListNode* head) {
12         ListNode *pre =NULL, *cur = head, *next = head;
13         if(head == NULL || head->next == NULL)
14             return head;
15         next = next->next;
16         while(next)
17         {
18             cur->next = pre;
19             pre = cur;
20             cur = next;
21             next = next->next;
22             //cur->next = pre;
23         }
24         cur->next = pre;
25         return cur;
26     }
27 };            

 

posted @ 2015-05-06 14:04  响亮的菠萝  阅读(134)  评论(0)    收藏  举报