swap-two-nodes-in-linked-list(交换链表中的两个结点)
链接:http://www.lintcode.com/zh-cn/problem/swap-two-nodes-in-linked-list/
给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。
注意事项
你需要交换两个节点而不是改变节点的权值
分析:为了统一处理,加了一个头结点,链表交换处理,需要知道当前结点和前一个结点,第一次的val值等于v1或者v2时,找到第一个结点,此时p1为空,p1赋值为需要交换的第一个结点,pre为前一个的节点,第二次val的值等于v1或者v2时,定义一个t记录后一个结点,两个要交换的结点都找出来了,分两种情况:(1)如果两个结点相邻,直接把p1和p2位置交换一下即可,(2)不相邻,需要考虑中间的结点,p2的后面接中间部分,再接p1,p1后面接t。完成
/**
*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
* @oaram 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* dummy=new ListNode(0);
dummy->next=head;
ListNode *cur=dummy,*pre=dummy;
ListNode *p1=nullptr,*p2=nullptr;
while(cur->next)
{
if(cur->next->val==v1||cur->next->val==v2)
{
if(!p1)
{
p1=cur->next;
pre=cur;
}
else
{
ListNode*t=cur->next->next;
p2=cur->next;
pre->next=p2;
if(p1==cur)
{
p2->next=p1;
p1->next=t;
}
else
{
p2->next=p1->next;
cur->next=p1;
p1->next=t;
}
return dummy->next;
}
}
cur=cur->next;
}
return dummy->next;
}
};