leetcode: 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.

原问题链接:https://leetcode.com/problems/swap-nodes-in-pairs/

问题分析

    这个问题看起来比较简单,主要是要对里面的实现细节考虑清楚了。我们可以结合一个图来考虑。

    假定我们有这么一个链表,我们首先设定它们要交换的两个元素分别为first, second。

    因为要交换first, second, 所以首先将first.next赋值给second.next:

     然后再将first.next指向second:

    由上图很明显,我们还需要调整pre引用,使得pre.next = first:

    上面的描述是针对某个时候节点调整的细节。不过既然前面要求是对整个链表里每两个相邻的元素都这么调整。那么这里必然是用一个循环来处理。在每个循环的开始,我们将pre.next赋值给second,pre.next.next赋值给first。因为链表里元素可能有奇数个或者偶数个元素,我们可以将pre.next != null && pre.next.next != null作为循环跳出的条件。

  这样,作为一个完整的循环。我们会在每个循环的开始将pre.next, pre.next.next分别赋值给second和first。同时在调整结束后将pre设置为second的值。这样方便在下一个循环继续调整。

   按照前面的讨论,详细实现的代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode temp = new ListNode(0);
        temp.next = head;
        ListNode pre = temp, first = null, second = null;
        while(pre.next != null && pre.next.next != null) {
            first = pre.next.next;
            second = pre.next;
            second.next = first.next;
            first.next = second;
            pre.next = first;
            pre = second;
        }
        return temp.next;
    }
}

  

猜你喜欢

转载自shmilyaw-hotmail-com.iteye.com/blog/2286331