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;
    }
};
posted @ 2017-08-24 13:40  LiBaoquan  阅读(483)  评论(0编辑  收藏  举报