LeetCode24.两两交换链表中的节点

使用虚拟头节点法,在交换 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,意为当下一个节点和下下一个节点存在时才进行交换操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值