您的位置:首页 > 其它

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

2017-10-27 09:34 621 查看
给你一个链表以及两个权值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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: