- 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
思路
/**
* 两两交换链表中的节点
*
* 定义一个虚拟头节点,记录head 的位置
* 定义三个指针、头一个节点,两个交换指针,3个节点 3个节点的,
* 处理整个链表,遇到奇数链表,最后一位不处理
* 时间复杂度 o (2/n) ;两两交换,只需要处理2/n 的时间就可以处理完
* 空间o(1) 没有使用额外空间
*/
代码
public ListNode swapPairs(ListNode head) {
if (head == null) {
return null;
}
if (head.next == null) {
return head;
}
ListNode dummy = new ListNode(-1);// 虚拟头节点.处理头结点
dummy.next = head;
ListNode p = dummy;
ListNode a = null;
ListNode b = null;
while (p.next != null && p.next.next != null) {
a = p.next;
b = a.next;
//交换位置
p.next = b;
a.next = b.next;
b.next = a;
//更新指针位置
p = a;
}
return dummy.next;
}