LeetCode 两两交换链表中的节点

61 阅读3分钟

LeetCode 两两交换链表中的节点

题目描述

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。不能修改节点的值,只能修改节点的指针。

示例:

输入:head = [1,2,3,4] 输出:[2,1,4,3]

知识点讲解

  1. 链表的基本操作 链表(Linked List)是一种线性数据结构,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。由于链表中的指针指向下一个节点,所以链表中的数据元素在内存中并不是顺序存储的。相比于数组的顺序存储,链表的优点在于链表插入和删除操作的时间复杂度为O(1),因为在链表中执行插入和删除只需要修改指针,不需要移动结点。

常见的链表操作有:链表的创建、链表的遍历、链表的插入和删除、链表的反转和翻转等等。

以下为实现单向链表的代码:

class ListNode {
      int val;
      ListNode next;
      ListNode(int x) { val = x; }
}

class LinkedList {
      ListNode head;

      public LinkedList() {
            this.head = null;
      }

      public void add(int val) {
            if (head == null) {
                  head = new ListNode(val);
                  return;
            }
            ListNode cur = head;
            while (cur.next != null) {
                  cur = cur.next;
            }
            cur.next = new ListNode(val);
            return;
      }

      public void print() {
            ListNode cur = head;
            while (cur != null) {
                  System.out.print(cur.val + " ");
                  cur = cur.next;
            }
            System.out.println();
      }
}
  1. 链表的遍历 遍历单向链表可以使用while循环,每次将当前节点向后移动一位,直到节点为null为止。对于给定的单向链表,我们可以通过以下代码进行遍历:
ListNode cur = head;
while (cur != null) {
      // 处理节点cur
      cur = cur.next;
}
  1. 链表的交换 交换链表节点时,我们需要记录上一个节点、当前节点和下一个节点。首先我们使用辅助节点pre记录上一个节点,需要交换的节点为cur和nex,交换前cur节点的next指针指向nex的下一个节点,即cur.next = nex.next,然后将pre节点的next指针指向nex,nex的next指针指向cur节点,即pre.next = nex,nex.next = cur。最后,我们将pre指向cur,继续进行下一组节点的交换即可。如下图所示:

由于需要交换两个节点,因此我们需要在遍历时从第二个节点开始交换。我们可以设置一个空的节点作为头结点,使其指向链表的头节点,然后在遍历单向链表时每次取出两个节点进行交换即可。如下代码实现:

public ListNode swapPairs(ListNode head) {
      ListNode dummy = new ListNode(0);
      dummy.next = head;
      ListNode pre = dummy;
      while (pre.next != null && pre.next.next != null) {
            ListNode cur = pre.next;
            ListNode nex = cur.next;
            cur.next = nex.next;
            nex.next = cur;
            pre.next = nex;
            pre = cur;
      }
      return dummy.next;
}

完整的Java代码如下:

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;
        while (pre.next != null && pre.next.next != null) {
            ListNode cur = pre.next;
            ListNode nex = cur.next;
            cur.next = nex.next;
            nex.next = cur;
            pre.next = nex;
            pre = cur;
        }
        return dummy.next;
    }
}

总结

本文介绍了LeetCode中的两两交换链表中的节点问题,并对链表的基本知识点进行了讲解,包括链表的创建、链表的遍历和链表的交换。最后,通过Java实现了该题的解法,希望对大家有所帮助。