zoukankan      html  css  js  c++  java
  • lintcode-511-交换链表当中两个节点

    511-交换链表当中两个节点

    给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。

    注意事项

    你需要交换两个节点而不是改变节点的权值

    样例

    给出链表 1->2->3->4->null ,以及 v1 = 2 , v2 = 4
    返回结果 1->4->3->2->null。

    标签

    链表

    思路

    遍历链表,找到待交换的两个节点以及它们的前、后节点,之后交换即可

    code

    /**
     * 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
         * @param 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
            if (head == NULL || head->next == NULL) {
                return head;
            }
            if (v1 == v2) {
                return head;
            }
            ListNode * newHead = new ListNode(-1);
            newHead->next = head;
            ListNode *node1Prec = NULL, *node1 = NULL, *node1Next = NULL;
            ListNode *node2Prec = NULL, *node2 = NULL, *node2Next = NULL;
            ListNode *tempPrec = newHead, *temp = head, *tempNext = head->next;
    
            // 遍历链表,找到待交换节点
            while (temp != NULL) {
                if (temp->val == v1) {
                    node1Prec = tempPrec;
                    node1 = temp;
                    node1Next = tempNext;
                }
                else if (temp->val == v2) {
                    node2Prec = tempPrec;
                    node2 = temp;
                    node2Next = tempNext;
                }
                // 找到 2 个节点,退出寻找
                if (node1 != NULL && node2 != NULL) {
                    break;
                }
    
                tempPrec = tempPrec->next;
                temp = temp->next;
                if (tempNext != NULL) {
                    tempNext = tempNext->next;
                }
            }
    
            // 找到 2 个节点
            if (node1 != NULL && node2 != NULL) {
                if (node1->next == node2) {
                    node1->next = node2Next;
                    node2->next = node1;
                    node1Prec->next = node2;
                }
                else if (node2->next == node1) {
                    node2->next = node1Next;
                    node1->next = node2;
                    node2Prec->next = node1;
                }
                else {
                    node1Prec->next = node2;
                    node1->next = node2Next;
    
                    node2Prec->next = node1;
                    node2->next = node1Next;
                }
            }
    
            return newHead->next;
        }
    };
    
  • 相关阅读:
    linux添加超级用户
    MongDB配置方法
    【bzoj5174】[Jsoi2013]哈利波特与死亡圣器 二分+树形dp
    【bzoj3560】DZY Loves Math V 欧拉函数
    【bzoj5157】[Tjoi2014]上升子序列 树状数组
    【uoj#317】[NOI2017]游戏 2-SAT
    【bzoj5146】有趣的概率 微积分
    【bzoj4695】最假女选手 线段树区间最值操作
    【bzoj4355】Play with sequence 线段树区间最值操作
    【loj2319】[NOIP2017]列队 Splay(卡过)
  • 原文地址:https://www.cnblogs.com/libaoquan/p/7422596.html
Copyright © 2011-2022 走看看