题目:
//Given a linked list, swap every two adjacent nodes and return its head.
//
//
// Example 1:
//
//
//Input: head = [1,2,3,4]
//Output: [2,1,4,3]
//
//
// Example 2:
//
//
//Input: head = []
//Output: []
//
//
// Example 3:
//
//
//Input: head = [1]
//Output: [1]
//
//
//
// Constraints:
//
//
// The number of nodes in the list is in the range [0, 100].
// 0 <= Node.val <= 100
思路:
那就每两个进行交换(写个dfs),如q->a->b->w(交换a,b),伪代码如下:
temp = b.next;
b.next = a;
a.next = temp;
注意交换完成后, b->a->w,但是q依然指向a
如果再用变量去存,代码很臃肿。
思路写注释里了,代码如下:
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null) return null;
if(head.next == null) return head;
return dfs(head,head.next);
}
/**
* 两两交换
* @param preHead 这一组节点的前一个
* @param head 这一组节点的后一个
* @return 交换后,这组节点的头。因为我们两两交换并没有考虑交换后的头部节点的处理,
* 如果再用一个变量去存又显得代码很丑,所以将交换后的头结点返回给上一层去做处理。
*/
private ListNode dfs(ListNode preHead,ListNode head) {
// 下面三行:开始交换两个节点
ListNode tempNode = head.next;
head.next = preHead;
preHead.next = tempNode; // 这一句其实不用放到这里,放终止条件里即可
// 终止条件,交换完了再返回
if(tempNode == null) {
return head;
}
// 奇数不用交换
if(tempNode.next == null) {
return head;
}
// preHead是交换后尾部节点了
preHead.next = dfs(tempNode,tempNode.next);
return head;
}
}