LINTCODE——交换链表当中两个节点
说明:主要是考查操作链表,如果直接改变节点的权值就失去了做题的意义,代码首先查找节点所在的位置,然后交换节点,注意有一个为头节点的特殊情况;
ListNode * swapNodes(ListNode * head, int v1, int v2) {
// write your code here
if(head == NULL || v1 == v2)
return head;
//查找v1,v2的的所在位置
ListNode *v1Node = head , *v2Node = head , *v1Nodepre = head ;
ListNode *v2Nodepre = head , *curNode = head;
bool bv1 = false , bv2 = false ;
//给两个整数标记,方便之后的处理(只要是处理 V1 值所在位置在V2的后面)
int iv1 = 0 , iv2 = 0;
while( !(bv1 && bv2) && curNode != NULL)
{
if(curNode -> val == v1)
{
bv1 = true;
}
if(curNode -> val == v2)
{
bv2 = true;
}
if(!bv1)
{
v1Nodepre = v1Node ;
v1Node = v1Node -> next ;
iv1++;
}
if(!bv2)
{
v2Nodepre = v2Node ;
v2Node = v2Node -> next;
iv2++;
}
curNode = curNode -> next;
}
//如果没找到,直接返回
if( !(bv1 && bv2) )
return head;
//按先后排序v1,v2
if(iv1 > iv2)
{
ListNode *tempNode = v1Node , *vNodepre = v1Nodepre;
v1Node = v2Node ;
v1Nodepre = v2Nodepre;
v2Node = tempNode ;
v2Nodepre = vNodepre;
}
//处理节点,注意头结点的特殊情况
ListNode *v2NextNode = v2Node -> next;
v2Nodepre -> next = v1Node;
v2Node -> next = v1Node -> next;
v1Node -> next = v2NextNode;
if(v1Node == head)
{
return v2Node;
}
else
v1Nodepre -> next = v2Node;
return head;
}
};