链表是一种数据结构,由一系列节点组成,每个节点包含一个数据部分和一个指向下一个节点的指针。链表的基本特点包括:
-
节点:链表的基本单元,通常包含两个部分:
- 数据域(value/val):存储数据。
- 指针域(next/prev):指向下一个节点(单链表)或上一个节点和下一个节点(双链表)。
-
头节点:链表的起始节点。可以为
None
,表示链表为空。 -
尾节点:链表的最后一个节点,通常它的
next
指针为None
。 -
空链表:链表的头节点为
None
,表示链表中没有任何节点。 -
链表的类型:
- 单链表:每个节点只包含一个指向下一个节点的指针。
- 双链表:每个节点包含两个指针,分别指向下一个节点和前一个节点。
递归方法的基本思路
递归是一种在函数中调用自身的编程技术,用于解决可以分解为更小的相同问题的任务。递归的基本思路包括:
-
基本情况:确定递归的终止条件。基本情况是最简单的情况,不再递归,直接返回结果。
-
递归情况:将问题分解为更小的相同问题,并调用递归函数来解决这些子问题。通常需要在递归调用前处理一些必要的操作。
两两交换链表中的节点
创建一个虚拟头节点 dummy,其 next 指向链表的头节点。这样可以处理链表的头部交换问题。
循环遍历链表: 使用 current 指针来遍历链表。每次交换 current.next 和 current.next.next 两个节点。
节点交换:将 first 节点的 next 指向 second 节点的下一个节点。
将 second 节点的 next 指向 first 节点。
将 current.next 更新为 second 节点。
移动到下一个待处理节点: 更新 current 为 first 节点(交换后的第二个节点),继续处理后续节点。
返回结果: 返回 dummy.next 作为新链表的头节点。
设计链表