文章目录
题目
Problem: 24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例:
输入: 1->2->3->4
输出: 2->1->4->3
注意:
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
题解
一、思路
- 建立虚拟头结点可以不用单独考虑头结点的特殊情况:
java
ListNode dummy = new ListNode(-1);
dummy.next = head;
- 设置两个临时变量存储在交换时会丢失的结点,分别存储下一个结点的前一个和后一个结点
在循环时想清楚终止条件应该为什么:当后面没有结点时,不用再交换位置,在剩一个结点时,也不用交换位置,因为都不满足两个结点的个数不用进行交换,所以终止条件为:
while(cur.next != null&&cur.next.next!=null)
二、解题方法
首先创建虚拟头结点dummy,它的下一个结点指向头结点,按照图中步骤一二三,先指向2,此时结点1、3都由firstNode和secondNode保存,移动cur指针到要交换的元素前一个的位置,这样才能对交换的元素进行操作,循环结束后,记得返回虚拟头结点的下一个结点才是真正的头结点
三、Code
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(-1);
dummy.next = head;
ListNode cur = dummy;
ListNode firstNode;
ListNode secondNode;
while(cur.next != null&&cur.next.next!=null){
firstNode = cur.next;
secondNode = cur.next.next.next;
cur.next = cur.next.next; //步骤一
cur.next.next = firstNode;//步骤二
cur.next.next.next = secondNode;//步骤三
cur = cur.next.next;
}
return dummy.next;
}
}
总结
这就是对力扣第24题的解题思路和代码实现,需要注意的时如果想对当前元素进行操作,必须要让指针指在前一个元素才能.next
操作的了当前元素。希望本文对你理解和解决这道题有所帮助!