簡體   English   中英

如何反轉鏈表

[英]How to reverse a linked list

我正在研究 Stack Overflow 並遇到了 #92。

反轉鏈表 2 問題。 這是問題的描述:給定單鏈表的頭部和左右兩個整數,其中left <= right,將列表的節點從左位置反轉到右位置,並返回反轉后的列表。 例如,給定鏈表 [1,2,3,4,5] 1, 4 鏈表應該變成 [4,2,3,1,5]

它適用於所有運行,但我的代碼為一個測試用例產生了錯誤的答案,這沒有意義。 給定的。 [1,2,3,4] 1,4 1 是左側位置,4 是右側位置 列表成為有意義的是 [4,2,3,1] 這是我的代碼產生的。 他們顯示的正確答案是 [4,3,2,1],這讓我很頭疼,我不明白為什么會這樣。 任何抬頭表示贊賞。

class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) 
    {
        int x = 1;

        ListNode * left_node = nullptr;
        ListNode * right_node = nullptr;
        ListNode * curr = head;
        int temp = 0;
                
        if (!head)
            return nullptr;
        
        while(curr)
        {
            if(x == left)
                left_node = curr;
                
            if(x == right)
                right_node = curr;
            curr = curr->next;
            ++x;
        }
        
        temp = left_node->val;
        left_node->val = right_node->val;
        right_node->val = temp;
     
        return head;
    }

您的解決方案實現了左右交換 2 個索引的值,這與問題中給出的示例相匹配。

但問題是要顛倒左右之間的列表,而不僅僅是交換兩個端點。 所以1,2,3,4變成4,3,2,1是正確的解決方案,示例和您的解決方案都是錯誤的,它們只是交換端點。

PS:大多數語言從 0 開始計數。

@Goswin Von Brederlow 已經指出了問題所在,我將添加您正在做什么的可視化表示。 你能發現問題嗎?

在此處輸入圖像描述

編輯:您可以在評論中查看時間和空間方面的更好解決方案(以及更糟糕的解決方案)。

過了一會兒,您應該遍歷鏈表。 由於您沒有“prev”(沒有雙鏈表),因此您需要多次遍歷它才能反轉它。 我准備了算法的可視化,它使用從左到右的副本。 以及每次迭代時 prev 節點的支持node 它使用idxoidx來跟蹤原始和復制列表中的位置。

在此處輸入圖像描述

以下是迭代的步驟:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM