给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
方法:两两换位法
思路:
1,先换1,2的位置然后换3,4的位置,直至所有
2,假设1->2->3->4,我们先把第二个节点拿下来,就变成了1->3->4,然后再把第二个节点连到前面就变成了
2->1->3->4,再把这个值记录下来,然后移动指针到3这个位置,每次换两个节点位置即可;
3, 归根到底还是换位思想的应用
代码上有大致的注释
class Solution {
public ListNode swapPairs(ListNode head) {
//特殊情况
if (head == null || head.next == null) return head;
//定义头部哑结点
ListNode t = new ListNode(0);
t.next = head;
//控制节点变化
ListNode first = t;
//保存每次交换完的结果
ListNode second = t;
//截取第一个节点,放到第二个节点的next
first = first.next;//指向head的头结点
while(first != null) {
if (first.next == null)//奇数总结点
break;
//截取第二个节点
ListNode temp = first.next;
//拿到除去第二节点的后面部分
first.next = first.next.next;
temp.next = null;
temp.next = first;
second.next = temp;
second = second.next.next;
first = first.next;
}
return t.next;
}
}
注意:对每次两节点换后的记录以及移动位置开启下一轮。