当前位置:   article > 正文

【一起来刷题】链表操作问题之两两交换链表中的节点_交换链表中的两个节点

交换链表中的两个节点

本章收录于专栏:一起来刷题,持续更新中……

更多精彩文章,欢迎大家关注我,一起学习,一起进步~

推荐专栏:大道至简之机器学习算法系列

本节题目来源于LeetCode 两两交换链表中的节点

题目描述:

 这是一道中等题,但是是链表的常规操作题,需要对链表结构足够熟悉,就能轻松解答。推荐解题前,自己画个简图,然后一步一步改变节点连接,一目了然。

解题思路如下:

(1)因为要交换链表节点,所以要考虑到交换前后,两个节点的旧指向和新指向的变化,为了保证本轮交换不影响到下一轮,那么我们就需要将下一轮待交换子链表的首节点存起来,定义两个指针,一个指针prev指向待交换子链表的首节点,另一个指针为原始链表的头结点的复制品p:

temp = p.next.next

 

 

 (2)接下来就开始调整两个节点的指向。首先,让prev的旧连接断开,让prev新连接指向2(p.next):

prev.next = p.next

 (3)再将2的指向由原来的指向3,改为指向1(p):

prev.next.next = p

 (4)随后将1(p)的指向由原来的2,指向下一轮子链表的头结点3(temp):

p.next = temp

调整一下布局,更加清晰:

 (5)通过以上几步,我们将1和2交换了位置。准备进行下一轮交换,在此之前,我们要把prev和p放到它们该有的初始位置,即一个指向待交换子链表的头结点,另一个是待交换子链表的头结点的复制品:

  1. prev = p
  2. p = temp

 调整一下布局:

 Ok,第一轮交换完成。后续操作就是重复上述步骤即可。完整代码:

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, val=0, next=None):
  4. # self.val = val
  5. # self.next = next
  6. class Solution:
  7. def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
  8. if not head or not head.next:
  9. return head
  10. dummy = ListNode(None)
  11. dummy.next = head
  12. prev = dummy
  13. p = head
  14. while p and p.next:
  15. temp = p.next.next
  16. prev.next = p.next
  17. prev.next.next = p
  18. p.next = temp
  19. prev = p
  20. p = temp
  21. return dummy.next

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码吟游诗人/article/detail/61288
推荐阅读
相关标签
  

闽ICP备14008679号