24. Swap Nodes in Pairs

24. Swap Nodes in Pairs

题目

给出一个链表,交换每两个相邻的结点,并返回它的头结点。
比如:
给出 1->2->3->4, 你应该返回 2->1->4->3.
注意:
你的算法应该只用常数额外空间。
你可能并不修改列表结点的值,仅改变节点本身。

代码块

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

代码分析

本题刚开始没有思路,debug一遍后才慢慢理清思绪。
本题的重点是要分析循环结束的条件。
1.首先设置三个结点;
还要注意边界条件。以及设定哑变量(头结点位置会改变)。
2.然后满足条件的进行循环;(包含图中步骤1-6)
在循环中,先交换位置,然后将三个结点进行移位。
3.最后,做收尾处理。(包含图中步骤7-9)
做链表的题目时一定注意,要画一下位置,不然容易混乱。

步骤1,2,3是交换结点,4,5,6是将三个结点进行移位,7,8,9是做收尾处理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章