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