zoukankan      html  css  js  c++  java
  • [LeetCode] Swap Nodes in Pairs

    https://oj.leetcode.com/problems/swap-nodes-in-pairs/

    Given a linked list, swap every two adjacent nodes and return its head.

    For example,
    Given 1->2->3->4, you should return the list as 2->1->4->3.

    Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.

    Example Questions Candidate Might Ask:

    Q: What if the number of nodes in the linked list has only odd number of nodes?

    A: The last node should not be swapped.

    Solution:

    Let’s assume p, q, r are the current, next, and next’s next node.

    We could swap the nodes pairwise by adjusting where it’s pointing next:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
     
     q->next = p;
     p->next = r;

    The above operations transform the list from {p –> q –> r –> s } to {q –> p –> r –> s}.

    If the next pair of nodes exists, we should remember to connect p’s next to s. Therefore, we should record the current node before advancing to next pair of nodes.

    To determine the new list’s head, you look at if the list contains two or more elements. Basically, these extra conditional statements could be avoided by inserting an extra node(also knoen as the dummy head) to the front of list.

    Code:

    /**
     * Author : Acjx
     * Email  : zhoujx0219@163.com
     */
    
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution 
    {
    public:
        ListNode *swapPairs(ListNode *head) 
        {
            ListNode *dummyHead = new ListNode(0);
            dummyHead->next = head;
            ListNode *prev = dummyHead;
            ListNode *curr = head;
            
            // {curr->p->q->r} -> {p->curr->q->r}
            while (curr != NULL && curr->next != NULL)
            {
                ListNode *p = curr->next; 
                ListNode *q = curr->next->next;
                
                prev->next = p;
                p->next = curr;
                curr->next = q;
                
                prev = curr;
                curr = q;
            }
            
            return dummyHead->next;
        }
    };
  • 相关阅读:
    数据库异常状态:Recovery Pending,Suspect,估计Recovery的剩余时间
    Windows:任务调度器
    Package设计2:增量更新
    SSIS 数据流优化
    Data Profiling Task
    SSIS 表达式、操作符和函数
    SSIS 数据流的错误输出
    SSIS 控制流和数据流
    SET QUOTED_IDENTIFIER选项对索引的影响
    Security2:角色和权限
  • 原文地址:https://www.cnblogs.com/jianxinzhou/p/4314017.html
Copyright © 2011-2022 走看看