LINTCODE——交换链表当中两个节点

来源:互联网 发布:smtp.gmail.com 端口 编辑:程序博客网 时间:2024/05/17 13:43

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;    }};