Loading

LeetCode---24. 两两交换链表中的节点

题目:24. 两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

/**
 * 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) 来讲,需要将headnewHead交换位置,使newHead变成链表中的头节点,head变成第二个节点,然后head再指向已经处理好的链表
 以此类推,递归调用本身,直到最后只剩下一个节点或者为空,结束返回新的头指针,也就是newHead

步骤
  1. 首先应该进行判断,判断是否已经递归到了链表的结尾,也就是说,如果当前节点为null或者当前节点的下一个节点为null,就说明此时已经到了链表的结尾,可以直接返回当前节点给上一层
  2. 如果能够到达第二步,就说明当前节点没有到达链表的末尾,仍需将当前节点与下一个节点进行交换,先获取当前节点的下一个节点 (ListNode newHead = head.next;)
  3. 接着使当前节点指向递归调用部分,也就是当前节点指向后面已经处理好的部分 (head.next = swapPairs(newHead.next); )
  4. 然后使newHeadnext指向head,完成本次交换 (newHead.next = head;)
  5. 最后返回新的头指针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;
    }
}
posted @ 2021-04-23 11:28  ZhiZDK  阅读(40)  评论(0编辑  收藏  举报