给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
}
}
示例
输入:head = [1,2,3,4]
输出:[2,1,4,3]
可以使用递归来解决本题
思路:
两两交换链表中的节点,拿第一个节点头节点head与第二个节点newHead(newHead = head.next) 来讲,需要将head与newHead交换位置,使newHead变成链表中的头节点,head变成第二个节点,然后head再指向已经处理好的链表,
以此类推,递归调用本身,直到最后只剩下一个节点或者为空,结束返回新的头指针,也就是newHead
步骤
- 首先应该进行判断,判断是否已经递归到了链表的结尾,也就是说,如果当前节点为null或者当前节点的下一个节点为null,就说明此时已经到了链表的结尾,可以直接返回当前节点给上一层
- 如果能够到达第二步,就说明当前节点没有到达链表的末尾,仍需将当前节点与下一个节点进行交换,先获取当前节点的下一个节点 (ListNode newHead = head.next;)
- 接着使当前节点指向递归调用部分,也就是当前节点指向后面已经处理好的部分 (head.next = swapPairs(newHead.next); )
- 然后使newHead的next指向head,完成本次交换 (newHead.next = head;)
- 最后返回新的头指针newHead,题目完成 (return newHead;)
完整代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = head.next;
head.next = swapPairs(newHead.next);
newHead.next = head;
return newHead;
}
}