30.两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例1:
image

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例2:

输入:head = []
输出:[]

示例3:

输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100] 内
  • 0 <= Node.val <= 100

代码:
1.非递归

/**
 * 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) {
        //定义一个头节点
        ListNode pre = new ListNode(0,head);
        //定义一个节点指向头节点
        ListNode temp = pre;
        //只要当前节点的下一个节点和当前节点的下两个节点不为空就继续交换
        while(temp.next!=null&&temp.next.next!=null){
            //start为需要交换的两个节点中的第一个节点 
            ListNode start  = temp.next;
            //end为需要交换的两个节点中的第二个节点
            ListNode end = temp.next.next;
            //将头节点的next指针指向第二个节点,因为交换后第二个节点为首节点
            temp.next = end;
            //将第一个节点的next指针指向第二个节点的下一个节点
            start.next = end.next;
            //end节点指向start节点
            end.next = start;
            //temp节点移动至start节点
            temp = start;
        }
        //返回头节点
        return pre.next;
    }
}

2.递归

/**
 * 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;
        //head表示交换的第一个节点,next表示交换的第二个节点
        ListNode next = head.next;
        //第一个节点的next为下一次交换的头节点
        head.next = swapPairs(next.next);
        //next节点的next指向head节点
        next.next = head;
        //返回头节点,即第二个节点
        return next;
    }
}
posted @ 2025-04-23 11:10  回忆、少年  阅读(14)  评论(0)    收藏  举报