1. 程式人生 > 其它 >leetcode程式設計——【奇偶連結串列】

leetcode程式設計——【奇偶連結串列】

技術標籤:c++演算法

第一次在這上面寫總結,算是一個新的開始吧!

給定一個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。

請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 O(1),時間複雜度應為 O(nodes),nodes 為節點總數。

示例 1:

輸入: 1->2->3->4->5->NULL
輸出: 1->3->5->2->4->NULL

我的想法是將奇數節點和偶數節點分別拆分成奇數連結串列和偶數連結串列,之後將偶數連結串列接到奇數連結串列後頭

class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
     ListNode *odd_head,*odd_tail;
     ListNode *even_head,*even_tail;
      if(head != nullptr && head->next != nullptr){

        odd_head = head;
        odd_tail = odd_head;
        even_head = head->next;
        even_tail =
even_head; while(odd_tail != nullptr && odd_tail->next != nullptr){ odd_tail->next = even_tail->next; odd_tail = odd_tail->next; even_tail->next = odd_tail->next; even_tail = even_tail->next; } odd_tail->next =
even_head; } return head; } };

但出現了這個錯誤
runtime error: member access within null pointer of type ‘ListNode’
試圖使用空指標

最後找到錯誤原因:當給的原始連結串列為偶數個時,even_tail指向了最後一個節點,但迴圈終止條件沒達到。還要經歷一個迴圈,所以最後一個迴圈中even_tail->next指向了NULL,而even_tail也指向了空,所以將迴圈條件進行了更改

 while(even_tail != nullptr && even_tail->next != nullptr)

執行成功。