LintCode 交换链表当中两个节点

给你一个链表以及两个权值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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值