给你一个链表以及两个权值v1
和v2
,交换链表中权值为v1
和v2
的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。
注意事项
你需要交换两个节点而不是改变节点的权值
给出链表 1->2->3->4->null
,以及 v1
= 2
, v2
= 4
返回结果 1->4->3->2->null
。
/**
* 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* plist = head;
ListNode* p1r=NULL,*p2r=NULL,*p1n=NULL, *p2n=NULL;
ListNode* p1 = NULL, *p2 = NULL;
if(head==NULL)
return head;
ListNode* pr = NULL;
while(plist != NULL)
{
if(plist->val == v1 || plist->val == v2)
{
if(p1 == NULL)//前一个节点
{
p1r = pr;
p1 = plist;
}
else //后一个节点
{
p2r = pr;
p2 = plist;
p2n = p2->next;
if(p1->next == p2)//两个节点连续
{
p1->next = p2->next;
p2->next = p1;
if(p1r != NULL)//如果第一个节点不是头节点
p1r->next = p2;
else
return p2;//第一个节点是头节点,返回p2
}
else
{
if(p1r != NULL)//如果第一个节点不是是头节点
p1r->next = p2;
p2->next = p1->next; //交换节点需要用到两个节点指针以及他们前一节点指针
p2r->next = p1; //还需要其中一个后面的指针
p1->next = p2n;
if(p1r == NULL)
return p2;//第一个节点是头节点,返回p2
}
return head; //交换之后直接返回
}
}
pr = plist;
plist = plist->next;
}
return head;
}
};