描述
给你一个链表以及两个权值v1
和v2
,交换链表中权值为v1
和v2
的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。
你需要交换两个节点而不是改变节点的权值
您在真实的面试中是否遇到过这个题? 是
样例
给出链表 1->2->3->4->null
,以及 v1
= 2
, v2
= 4
返回结果 1->4->3->2->null
。
题目链接
程序
/**
* Definition of singly-linked-list:
* 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
//判断是否为空,是否只含有一个,v1和v2是否相等的情况
if(head == NULL || head->next == NULL || v1 == v2)
return head;
//必须要插入dummpy,作为目标节点的头节点
ListNode *dummpy = new ListNode(0);
dummpy->next = head;
ListNode *prenode1 = NULL, *prenode2 = NULL, *cur = dummpy;
//将prenode1保存v1的上一个节点,prenode2保存v2的上一个节点
while(cur->next){
if(cur->next->val == v1)
prenode1 = cur;
else if(cur->next->val == v2)
prenode2 = cur;
cur = cur->next;
}
//如果有一个或者两个为空,直接返回
if(prenode1 == NULL || prenode2 == NULL)
return dummpy->next;
//防止prenode2->next是prenode1
if(prenode2->next == prenode1){
ListNode *tmp = prenode1;
prenode1 = prenode2;
prenode2 = tmp;
}
//这里,不需要存node1的节点
//因为node2->next = node1->next的时候,node1还有效
ListNode *node1 = prenode1->next;
ListNode *node2 = prenode2->next;
ListNode *nextnode2 = node2->next;//只有一个next,即使是空也不怕
//node1和node2连着的情况
if(prenode1->next == prenode2){
prenode1->next = node2;
node2->next = node1;
node1->next = nextnode2;
}
else{
prenode1->next = node2;
node2->next = node1->next;
prenode2->next = node1;
node1->next = nextnode2;
}
return dummpy->next;
}
};