题目描述(中等难度)

24. Swap Nodes in Pairs - 图1

给定一个链表,然后两两交换链表的位置。

解法一 迭代

首先为了避免单独讨论头结点的情况,一般先申请一个空结点指向头结点,然后再用一个指针来遍历整个链表。

先来看一下图示:

24. Swap Nodes in Pairs - 图2

24. Swap Nodes in Pairs - 图3

24. Swap Nodes in Pairs - 图4

24. Swap Nodes in Pairs - 图5

24. Swap Nodes in Pairs - 图6

point 是两个要交换结点前边的一个位置。

  1. public ListNode swapPairs(ListNode head) {
  2. ListNode dummy = new ListNode(0);
  3. dummy.next = head;
  4. ListNode point = dummy;
  5. while (point.next != null && point.next.next != null) {
  6. ListNode swap1 = point.next;
  7. ListNode swap2 = point.next.next;
  8. point.next = swap2;
  9. swap1.next = swap2.next;
  10. swap2.next = swap1;
  11. point = swap1;
  12. }
  13. return dummy.next;
  14. }

时间复杂度:O(n)。

空间复杂度:O(1)。

解法二 递归

参考这里

自己画了个参考图。

24. Swap Nodes in Pairs - 图7

24. Swap Nodes in Pairs - 图8

  1. public ListNode swapPairs(ListNode head) {
  2. if ((head == null)||(head.next == null))
  3. return head;
  4. ListNode n = head.next;
  5. head.next = swapPairs(head.next.next);
  6. n.next = head;
  7. return n;
  8. }

递归时间复杂度留坑。

自己开始没有想出递归的算法,每次都会被递归的简洁吸引。另外,感觉链表的一些题,只要画图打打草稿,搞清指向关系,一般不难。

windliang wechat

添加好友一起进步~

如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^

如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 这里 查看详情