LintCode 交换链表当中两个节点

来源:互联网 发布:for与to的用法区别知乎 编辑:程序博客网 时间:2024/06/04 19:52

给你一个链表以及两个权值v1v2,交换链表中权值为v1v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。

样例

给出链表 1->2->3->4->null ,以及 v1 = 2 , v2 = 4
返回结果 1->4->3->2->null


分析:

找到两个节点和它们的前节点,把两个节点的前后节点都交换即可。

要注意两个节点相邻和头节点被交换的特殊情况。

/** * 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) {        // Write your code here        vector<ListNode*> buf;        ListNode* pre = NULL;        ListNode* cur = head;        while(cur) {            if(cur->val == v1 || cur->val == v2) {                buf.push_back(pre);                buf.push_back(cur);            }            pre = cur;            cur = cur->next;        }        if(buf.size() != 4) return head;                if(buf[1]->next == buf[3]) {            if(buf[0]) buf[0]->next = buf[3];            buf[1]->next = buf[3]->next;            buf[3]->next = buf[1];        }else {            if(buf[0]) buf[0]->next = buf[3];            if(buf[2]) buf[2]->next = buf[1];            ListNode* tmp = buf[3]->next;            buf[3]->next = buf[1]->next;            buf[1]->next = tmp;            }                if(buf[1] == head) return buf[3];        if(buf[3] == head) return buf[1];        return head;    }};


0 0
原创粉丝点击