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

描述

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

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

您在真实的面试中是否遇到过这个题?  是

样例

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

题目链接

程序



/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->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
        //判断是否为空,是否只含有一个,v1和v2是否相等的情况
        if(head == NULL || head->next == NULL || v1 == v2)
            return head;
        //必须要插入dummpy,作为目标节点的头节点
        ListNode *dummpy = new ListNode(0);
        dummpy->next = head;
        ListNode *prenode1 = NULL, *prenode2 = NULL, *cur = dummpy;
        //将prenode1保存v1的上一个节点,prenode2保存v2的上一个节点
        while(cur->next){
            if(cur->next->val == v1)
                prenode1 = cur;
            else if(cur->next->val == v2)
                prenode2 = cur;
            cur = cur->next;
        }
        //如果有一个或者两个为空,直接返回
        if(prenode1 == NULL || prenode2 == NULL)
            return dummpy->next;
        
        //防止prenode2->next是prenode1
        if(prenode2->next == prenode1){
            ListNode *tmp = prenode1;
            prenode1 = prenode2;
            prenode2 = tmp;
        }
        
        //这里,不需要存node1的节点
        //因为node2->next = node1->next的时候,node1还有效
        ListNode *node1 = prenode1->next;
        ListNode *node2 = prenode2->next;
        ListNode *nextnode2 = node2->next;//只有一个next,即使是空也不怕
        //node1和node2连着的情况
        if(prenode1->next == prenode2){
            prenode1->next = node2;
            node2->next = node1;
            node1->next = nextnode2;
        }
        else{
            prenode1->next = node2;
            node2->next = node1->next;
            prenode2->next = node1;
            node1->next = nextnode2;
        }
        return dummpy->next;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_18124075/article/details/81093341