一、题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/swap-nodes-in-pairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、运行结果
![](https://img-blog.csdnimg.cn/img_convert/23122870a92f425c8e59200d7c55c6b8.png)
三、解题思路
不能修改节点内部,也就是只能改变节点指针的指向,以链表每两个节点为一组,如相邻的三个结点一次是1, 2, 3, 设置一个指针p指向1,另一个指针q指向2, 首先从设置p的next指向3,然后保存3的next节点(作为下一次的操作的结点),然后设置3的next指向2, 2的next置空(防止出现环路),然后p移到2, q移动3的next(前面保存的),重复相同的操作。如果链表是奇数个结点,只需要再最后再连接一个节点即可。
四、AC代码
/**
* 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(-1);
ListNode p = dummy, q = head;
while(q != null && q.next != null){
p.next = q.next; //p的next指向q的next 这三行实现交换两个结点(指针指向)
ListNode tmp = p.next.next; //保存后面链表的第一个结点,方式丢失找不到
p.next.next = q;
q.next = null; //将q的next置空,否则会出现循环
p = q; //指针后移
q = tmp;
}
if(q != null) p.next = q; //奇数个结点的最后一个结点
return dummy.next;
}
}