问题描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
1->2->3->4, 你应该返回 2->1->4->3.
解题思路:
解决该问题可以通过两种方式: 一是交换相邻节点的值,二是改变next指针的方向。
代码
解法一
递归 交换相邻节点的值
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode first = head;
swapPairs(first.next.next);
// 交换相邻节点的值
int tmp = first.val;
first.val = first.next.val;
first.next.val = tmp;
return head;
}
迭代 交换相邻节点的值
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null ) {
return head;
}
ListNode first = head;
while(head != null) {
if(head.next == null) {
return first;
}
int tmp = head.val;
head.val = head.next.val;
head.next.val = tmp;
if(head.next.next == null) {
break;
}
head = head.next.next;
}
return first;
}
解法二
改变指针的方向
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode first = head.next;
head.next = swapPairs(first.next);
first.next = head;
return first;
}