给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public ListNode swapPairs(ListNode head) {
// return swapPairsI(head);
return swapPairsII(head);
}
//方法二:非递归
//1.定义first为交换节点中前面的节点,second为交换节点中后面的节点
//2.定义prevNode为first的前驱节点
//3.交换两个节点,同时更新head和prev节点
private ListNode swapPairsII(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
while (head != null && head.next != null) {
//定义两个节点
ListNode first = head;
ListNode second = head.next;
//交换
prev.next = second;
first.next = second.next;
second.next = first;
//更新head和prev节点
prev = first;
head = first.next;
}
//返回新的头结点
return dummy.next;
}
//方法一:递归
//递归本质就是不断重复相同的事情,主要关注三点:
//1.终止条件
//2.调用单元做了什么
//3.返回值
private ListNode swapPairsI(ListNode head) {
//终止条件
if (head == null || head.next == null) return head;
//调用单元 1-2-3-4转换成2-1-4-3
ListNode first = head;
ListNode second = head.next;
//first连接交换完成的子链表
first.next = swapPairs(second.next);
//second连接first
second.next = first;
//返回子链表的头结点
return second;
}
}