簡體   English   中英

如何成對反向鏈接列表

[英]How to reverse a linked list in pairs

我想反向鏈接對列表,以便如果列表是1-> 2-> 3-> 4-> X,那么它應該輸出以下2-> 1-> 4-> 3-> X

我試圖解決此問題,但它似乎沒有運行。 伙計們,您能幫我解決代碼中的錯誤嗎?

ListNode* reverseListInPairs(ListNode *head){
        ListNode *current = head,*newHead = NULL,*temp = NULL,*prev = NULL;
        while(current != NULL && current->next != NULL){

            temp = current->next;
            current->next = current->next->next;
            temp->next = current;
            prev->next = temp;
            prev = current;
            current = current->next;
            if(newHead == NULL){
                newHead = temp;
            }
        }
        return newHead;
    }

我的代碼有什么問題。

我看到的主要問題是在這里:

  prev->next = temp; 

在循環的第一次迭代中, prev在那時仍為NULL ,因此您正在執行空指針取消引用。

您可以解決該問題,還可以通過在實際節點的前面引入一個合成頭節點來消除列表頭的特殊情況:

ListNode* reverseListInPairs(ListNode *head) {
    ListNode fake_head = { .next = head };
    ListNode *prev = &fake_head;
    ListNode *current = head;

    while (current != NULL && current->next != NULL) {
        ListNode *temp = current->next;

        current->next = current->next->next;
        temp->next = current;
        prev->next = temp;

        prev = current;
        current = current->next;
    }

    return fake_head.next;
}

我在這里盡可能地接近您的原始代碼,但就我個人而言,我將其進一步加緊。 特別是,您無需在prev迭代中都保持current和上一個狀態。 僅后者就足夠了。

ListNode* reverseListInPairs(ListNode *head) {
    ListNode fake_head = { .next = head };
    ListNode *prev = &fake_head;

    while (prev->next && prev->next->next) {
        ListNode *first = prev->next;
        ListNode *second = first->next;

        prev->next = second;
        first->next = second->next;
        second->next = first;

        prev = first;
    }

    return fake_head.next;
}
Node *reverse (Node *head, int k)  
{  
    Node* current = head;  
    Node* next = NULL;  
    Node* prev = NULL;  
    int count = 0;  
    while (current != NULL && count < k)  
    {  
        next = current->next;  
        current->next = prev;  
        prev = current;  
        current = next;  
        count++;  
    }  
    if (next != NULL)  
    head->next = reverse(next, k);  
    return prev;  
} 

通過k的值為2

void pairWiseSwap(struct Node* head) 
{ 
    struct Node* temp = head; 

    /* Traverse further only if there are at-least two nodes left */
    while (temp != NULL && temp->next != NULL) { 
        /* Swap data of node with its next node's data */
        swap(&temp->data, &temp->next->data); 

        /* Move temp by 2 for the next pair */
        temp = temp->next->next; 
    } 
} 

源自GeeksForGeeks

至於錯誤是什么,已經指出prev已經為NULL。

 ListNode *current = head,*newHead = NULL,*temp = NULL,*prev = NULL;
 .
 .
 prev->next = temp;

我們不能使用NULL-> next,因為它將引發分段錯誤。

暫無
暫無

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

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