交换链表当中两个节点-LintCode

来源:互联网 发布:上海大学网络教学平台 编辑:程序博客网 时间:2024/05/29 17:42

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

注意事项:
你需要交换两个节点而不是改变节点的权值

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

#ifndef C511_H#define C511_H#include<iostream>using namespace std;class ListNode{public:    int val;    ListNode *next;    ListNode(int val)    {        this->val = val;        this->next = NULL;    }};class Solution {public:    /*    * @param head: a ListNode    * @param 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        if (head == NULL)            return NULL;        ListNode *start = new ListNode(-1);        start->next = head;        ListNode *prev1 = start;        ListNode *prev2 = start;        ListNode *pv1 = head;        ListNode *pv2 = head;        while (pv1 != NULL)        {            if (pv1->val == v1)                break;            pv1 = pv1->next;            prev1 = prev1->next;        }        while (pv2 != NULL)        {            if (pv2->val == v2)                break;            pv2 = pv2->next;            prev2 = prev2->next;        }        if (pv1 == NULL || pv2 == NULL)            return head;        if (pv1->next == pv2)        {            pv1->next = pv1->next->next;            prev1->next = pv2;            pv2->next = pv1;            return start->next;        }        if (pv2->next == pv1)        {            pv2->next = pv2->next->next;            prev2->next = pv1;            pv1->next = pv2;            return start->next;        }        ListNode *tmp = pv2->next;        prev1->next = pv2;        pv2->next = pv1->next;        prev2->next = pv1;        pv1->next = tmp;        return start->next;    }};#endif
原创粉丝点击