使用虚拟头节点法,在交换 2 个节点时需要知道 4 个位置:2 个进行交换操作的节点位置,1 个在节点前的节点,1 个在节点后的节点。例:1 -> 2 -> 3 -> 4,交换 1,2 节点,需要知道 1 节点前的节点(即虚拟头节点)与 3 节点,才能保证交换后其他节点不受影响。
- 利用指针,记录在交换前需要知道的 4 个位置(因为指针始终指向需要交换节点的前一个节点,因此用变量记录 3 个位置即可)
- 进行节点交换后移动指针
例:相邻的节点 val = 5 与 val = 75 交换
开始进行交换后,current 的指向会发生变化,这就是一开始要存位置的原因
记录了 3 个节点的位置之后能进行灵活的变换,当然在变化后的 current 指针能直接找到 i = 1的节点,为了节省内存可以将 flag = current.next.next 删去
最后一步完成后,要将current指针指向下一个操作目标前,current = current.next.next
循环停止条件是没有能够两两相配的节点能够交换,当为奇数时指针移动到末尾能够得到current.next.next = None,而为偶数时,应为current.next = None,而 current.next.next会报空指针异常,因为循环条件应写为 while current.next and current.next.next,意为当下一个节点和下下一个节点存在时才进行交换操作。