最開始我想到的是用先遍歷鏈表,把元素存入數組中,然後反向遍歷數組在重新生成一個鏈表。首先判斷當鏈表沒有節點,或只有一個節點的時候,反轉後還是它本身,直接返回頭節點。在leetcode提交的runtime是8ms代碼如下:
<span style="font-size:18px;"> ListNode* reverseList(ListNode* head) {
ListNode *tmp=NULL,*res = NULL,*dummy = new ListNode(0);
vector<int> v;
tmp = head;
res = dummy;
if(head == NULL || head->next == NULL)
return head;
while(tmp != NULL)
{
v.push_back(tmp->val);
tmp = tmp->next;
}
for(int i = v.size()-1;i>=0;i--)
{
ListNode* t = new ListNode(0);
t->val = v[i];
dummy->next = t;
dummy = dummy->next;
}
return res->next;
}</span>
然後看到DIscuss裏面還有一種是原址的,只需要O(1)個額外空間,比較巧妙,只需要遍歷一次即可。但是leetcode提交的是20ms,代碼如下:
ListNode* reverseList(ListNode* head) {
ListNode *it,*pre=NULL,*temp;
it = head;
if(it == NULL || it->next == NULL)
return head;
while(it)
{
temp = it->next;
it->next = pre;
pre = it;
it = temp;
}
return pre;
}