题目描述
题目地址:https://leetcode-cn.com/problems/swap-nodes-in-pairs
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100
解法(JAVA)
/**
* 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 dummy = new ListNode(0,head); // 建立虚拟头节点
ListNode pre = dummy; // pre指向虚拟头节点
while(pre.next != null && pre.next.next != null) // 保证起码有两个节点,到链表末端就结束
{
//定义虚拟头节点是第0个节点,head是第1个节点...以此类推
ListNode temp = head.next.next; //把第三个节点信息存起来
pre.next = head.next; //让pre后续指向第二个节点
head.next.next = head; //让第二个节点后续指向head,即一,二节点调换位置
head.next = temp; //让此时位于第二节点的head后续指向第三个节点
pre = head; //pre向后走两步,到达第二节点位置
head = head.next; //head向后走两步,到达第三节点位置
}
return dummy.next;
}
}
// 递归算法
class Solution {
public ListNode swapPairs(ListNode head) {
// 确定退出条件
if(head == null || head.next == null) return head;
// next指向交换双方中的第二个节点
ListNode next = head.next;
// 开始递归,将第三个节点塞入,newnode接收一次递归结束后的第一个节点
ListNode newnode = swapPairs(next.next);
//开始交换
next.next = head; //第二节点后续指向第一节点
head.next = newnode; //第一节点后续指向上一次递归的第一节点
return next;
}
}
Github分享
https://github.com/zhzz1996