[LintCode] Swap Two Nodes in Linked List 交換鏈表中的兩個結點

Given a linked list and two values v1 and v2. Swap the two nodes in the linked list with values v1 and v2. It's guaranteed there is no duplicate values in the linked list. If v1 or v2 does not exist in the given linked list, do nothing.

Notice

You should swap the two nodes with values v1 and v2. Do not directly swap the values of the two nodes.

Example
Given 1->2->3->4->null and v1 = 2, v2 = 4.

Return 1->4->3->2->null.

 

LeetCode上有一道類似的題目Swap Nodes in Pairs,但是又不太一樣。這道題其實難度適中,但是需要注意的地方不少。首先需要交換的兩個結點有可能是相鄰的兩個結點,而且有可能v1在v2後面,也有可能首結點就需要交換,那麼我們還是一如既往的先設一個dummy結點,後面連上首結點,我們的思路是遍歷整個鏈表,如果cur的下一個結點存在,且等於v1或v2中的一個,此時如果p1爲空,說明這是要交換的第一個結點,我們將p1指向這個結點,然後講pre指向cur,交換操作需要記錄要交換的結點的前一個位置,然後繼續遍歷,當又遇到一個和v1或v2相等的結點,此時我們就需要交換了,我們用p2指向這個結點,然後用臨時變量t指向下一個結點,此時我們需要判斷cur和p1是相等,相等的話說明p1和p2是相鄰的,我們只需要把p2移到p1前面去,如果不相等,說明p1和p2之間還有元素,那麼我們交換p1和p2的位置即可,最後返回dummy->next即可:


注意:如果想去掉第49行的return,就必須加上53行break,因爲有可能交換的數在鏈表的最後一個節點..如果再指向下一個節點的話就會使用空節點,導致越界...

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */


class Solution {
public:
    /**
     * @param head a ListNode
     * @oaram v1 an integer
     * @param v2 an integer
     * @return a new head of singly-linked list
     */
    ListNode* swapNodes(ListNode* head, int v1, int v2) {
        ListNode *dummy=new ListNode(-1);
        dummy->next=head;
        ListNode *pre=dummy, *cur=dummy, *p1=NULL, *p2=NULL;
        while(cur->next)
        {
            if(cur->next->val==v1||cur->next->val==v2)
            {
                if(p1==NULL)
                {
                    pre=cur;
                    p1=cur->next;
                }
                else
                {
                    p2=cur->next;
                    pre->next=p2;
                    if(cur!=p1)
                    {
                        ListNode *t=p2->next;
                        p2->next=p1->next;
                        cur->next=p1;
                        p1->next=t;
                        
                    }
                    else
                    {
                        p1->next=p2->next;
                        p2->next=p1;
                    }
                    //return dummy->next;
                }
            }
            cur=cur->next;
            if(cur==NULL) break;
        }
        return dummy->next;
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章