两两交换链表中的节点

题目描述

这是leetcode 24题
Given a linked list, swap every two adjacent nodes and return its head.
You may not modify the values in the list’s nodes, only nodes itself may be changed.
example:
Given 1->2->3->4, you should return the list as 2->1->4->3.

分析

该题可以有两种解法,一种是暴力的迭代法,一种是递归解法。

迭代法

迭代法借助一个前置指针实现。
链表 分区为 已翻转部分、待翻转部分、未翻转部分。
初始化两个变量 temp表示待翻转链表的前驱、end表示待翻转链表的末尾;
翻转链表,然后重置temp和end 进入下一次循环;
特殊情况,当temp.next == null 或者temp.next.next == null 表示已经到达末尾,题目已经完成直接返回即可。
时间复杂度为O(n),空间复杂度为O(1)。

两两交换链表中的节点_第1张图片
代码如下

/**
	 * Iterator solution
	 * @param head
	 * @return
	 */
	public static ListNode swapNodeInPairsByIterator(ListNode head) {
		ListNode pre = new ListNode(0);
		pre.next = head;
		ListNode temp = pre;
		while(temp.next!=null && temp.next.next!=null) {
			ListNode start = temp.next;
            ListNode end = temp.next.next;
            temp.next = end;
            start.next = end.next;
            end.next = start;
            temp = start;
		}
		return pre.next;
	}

递归解法

递归解法的关键是明确三点:

  • 终止条件是什么
    head == null 或者 next == null;
  • 返回值是什么
    完成交换的子链表;
  • 递归单元做了什么
    设置交换的两个节点head 和 next ,head 连接交换后的子链表,next连接head,完成交换。
    时间复杂度O(n),空间复杂度为O(n).

代码实现:

/**
	 * recursion solution
	 * head --> next -->post   ===>  next --> head -->post 
	 * @param head
	 * @return
	 */
	public static ListNode swapNodeInPairsByRecursion(ListNode head) {
		// termination
		if(head == null || head.next == null) {
			return head;
		}
		ListNode next = head.next;
		head.next = swapNodeInPairsByRecursion(next.next);
		next.next = head;
		return next;
	}

你可能感兴趣的:(算法,ARTS)