给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
思路:
就地逆序+虚拟头节点。通过调整节点指针域的指向来直接调换相邻的两个节点。如果时偶数个节点,那么将偶数个节点调换;如果是奇数个节点,那么只需要将最后一个节点以外的节点调换即可。对于无头节点的链表可以创建一个虚拟头节点,使任意一个节点都有其前驱节点,便于操作。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null){
return head;
}
//创建一个虚拟头节点,数据域象征给-1
ListNode dummyNode = new ListNode(-1);
dummyNode.next = head;
ListNode cur = head;//当前遍历的节点
ListNode pre = dummyNode;//当前节点的前驱节点
ListNode next = null;//当前节点后继节点的后继节点
while(cur!=null && cur.next!=null){
//操作前要先保存后面的节点
next = cur.next.next;
//逆序操作
pre.next = cur.next;
cur.next.next = cur;
cur.next = next;
//指针后移
pre = cur;
cur = next;
}
return dummyNode.next;
}
}