题解 | #链表内指定区间反转#

链表内指定区间反转

https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

BM2 链表内指定区间反转

解题思路:[头插法]

在学会了BM1.反转链表之后,要解决这个问题就很简单了,前一题是整个链表反转,这一题是部分反转,这上一题就是这道题的前置问题啊。那我们肯定是要先找到了第m个位置才能开始反转链表,而反转的部分就是从第m个位置到第n个位置,反转这部分的时候就参照BM1.反转链表

具体做法:

  • step 1:我们可以在链表前加一个表头,后续返回时去掉就好了,因为如果要从链表头的位置开始反转,在多了一个表头的情况下就能保证第一个节点永远不会反转,不会到后面去。
  • step 2:使用两个指针,一个指向当前节点,一个指向前序节点。
  • step 3:依次遍历链表,到第m个的位置。
  • step 4:对于从m到n这些个位置的节点,依次断掉指向后续的指针,反转指针方向。
  • step 5:返回时去掉我们添加的表头。

# 从m反转到n,-1->1->2->3->4->5,m=2,n=4
for i in range(m,n):
    temp = cur.next #第一次循环 pre:1 cur:2 temp:3
    cur.next = temp.next # 2->4  !!!赋值号左边代表指针的指向,右边代表指针所指的元素。比如temp:3 temp.next:4, cur.next代表2->3的指向。
    temp.next = pre.next # 3->2
    pre.next = temp # 1->3
   	# 第一次循环结束后变成-1->1->3->2->4->5

Code

class Solution:
    def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
        # 加个表头 -1->1->2->3->4->5
        res = ListNode(-1)
        res.next = head
        # 前序节点
        pre = res
        # 当前节点
        cur = head
        # 找到m
        for i in range(1,m):
            pre = cur
            cur = cur.next
        # 从m反转到n,-1->1->2->3->4->5,m=2,n=4
        for i in range(m,n):
            temp = cur.next #第一次循环 pre:1 cur:2 temp:3
            cur.next = temp.next # 2->4  !!!赋值号左边代表指针的指向,右边代表指针所指的元素。比如temp:3 temp.next:4, cur.next代表2->3的指向。
            temp.next = pre.next # 3->2
            pre.next = temp # 1->3
        # 返回去掉表头
        return res.next

全部评论

相关推荐

09-27 00:29
东北大学 Java
伟大的麻辣烫:查看图片
阿里巴巴稳定性 75人发布 投递阿里巴巴等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务