给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
注意:你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
-
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
//相邻的节点位置交换 1-> 2 -> 3 -> 4 => 2 -> 1 -> 4 -> 3;
public static ListNode swapPairs(ListNode head) {
if (head == null) return null; //若节点为空,则直接返回
if (head.next == null) return head; //若下一个节点为空,说明不能构成互换的条件
ListNode head_next = head.next; // 下一个节点
//节点互换
head.next = swapPairs(head_next.next); // 一次将下一个节点传入递归函数中,(递归条件终止)将head的next指针指向head_next的后一个节点
head_next.next = head; //(递归条件终止) 将head_next的next指针指向head
return head_next; //返回head_next节点作为新的头节点
}
}
/*
借助栈实现思路:
构建泛型为ListNode的Stack对象(且栈的长度为2),创建一个虚拟头节点head
* 依次将相邻的两个节点压入栈中
将栈顶元素弹栈,依次作为头节点的后继节点,同时更新头节点head = head.next,直至栈为空
* 若最后栈中不为空则直接将该节点弹出,接入head.next之后
*/
执行用时 :1 ms, 在所有 Java 提交中击败了91.38%的用户
内存消耗 :34.1 MB, 在所有 Java 提交中击败了89.09%的用户