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

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;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值