交换链表当中两个节点
描述
给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。
注意事项
你需要交换两个节点而不是改变节点的权值
样例
给出链表 1->2->3->4->null ,以及 v1 = 2 , v2 = 4
返回结果 1->4->3->2->null。
由于要同时记录两个指针的pre、next,所以要注意head->val==v1(v2)的情况,先将遍历指针指向head并保存一份最后返回。
还有一个比较坑的地方是v1->next==v2或者反过来的情况,这种情况下如果不做处理的话会导致v2=v1->next造成循环,跑出来是MLE。
/**
* 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
* @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
ListNode* v1p=NULL,*v2p=NULL,*v1o,*v2o,*v1n,*v2n;
ListNode* p=new ListNode;
p->next=head;
ListNode* h=p;
while(p->next!=NULL)
{
if(p->next->val==v1)
{
v1p=p;
v1o=p->next;
v1n=p->next->next;
}
if(p->next->val==v2)
{
v2p=p;
v2o=p->next;
v2n=p->next->next;
}
p=p->next;
}
if(v1p!=NULL && v2p!=NULL)
{
if(v1o->next==v2o)
{
v2o->next=v1o;
v1p->next=v2o;
v1o->next=v2n;
}
else if(v2o->next==v1o)
{
v1o->next=v2o;
v2p->next=v1o;
v2o->next=v1n;
}
else
{
v1p->next=v2o;
v2p->next=v1o;
v1o->next=v2n;
v2o->next=v1n;
}
}
return h->next;
}
};