给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例: 给定 1->2->3->4
, 你应该返回 2->1->4->3
.
说明:
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路:
递归
利用了回溯的思想,递归遍历到链表末尾,然后先交换末尾两个,然后依次往前交换。
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) return head;
ListNode node = head.next;
head.next = swapPairs(head.next.next);
node.next = head;
return node;
}
迭代
- 两个一组去交换,注意先保存第三个结点
- 指针一个指向这组的前一个结点,一个指向一组的第一个结点
- 然后交换后两个指针要继续向后移动
public ListNode swapPairs(ListNode head) {
if(head==null || head.next==null) return head;
ListNode node = new ListNode(-1);
node.next = head;
ListNode pre1 = node;
ListNode pre2 = head;
while(pre2 != null && pre2.next != null){
ListNode nextStart = pre2.next.next;
pre2.next.next = pre2;
pre1.next = pre2.next;
pre2.next = nextStart;
pre1 = pre2;
pre2 = pre2.next;
}
return node.next;
}