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

链表内指定区间反转

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

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
  * 
  * @param head ListNode类 
  * @param m int整型 
  * @param n int整型 
  * @return ListNode类
*/

// 大致思路见注释

func reverseBetween( head *ListNode ,  m int ,  n int ) *ListNode {
    // write code here\
    var pTempHead, pTempTail *ListNode
    pTempHead = head
    pTempTail = head
    
    var pHeadPre *ListNode
    pHeadPre = nil
    
    for m > 1 {    // 找到待翻转部分的起始点
        pHeadPre = pTempTail    // 锁定起始点的前一节点位置,用于后续拼接工作
        pTempTail = pTempTail.Next
        m--
    }
    for n > 1 {    // 找到待翻转部分的终点
        pTempHead = pTempHead.Next
        n--
    }
    
    var pTailNext *ListNode
    pTailNext = pTempHead.Next    // 锁定终点的后一节点位置,用于后续拼接工作
    
    var pWork *ListNode
    pWork = pTempTail
    
    var pPre *ListNode = nil
    var pCurrent *ListNode
    
    for pWork != pTailNext {    // 具体翻转逻辑,即头插法
        pCurrent = pWork
        pWork = pWork.Next
        pCurrent.Next = pPre
        pPre = pCurrent
    }   
 
    // 此处开始皆为拼接工作
    if pHeadPre == nil && pTailNext == nil {    // 如果起始点为原链表的第一个节点,终点为原链表的终点,则进行全翻转
        return pTempHead
    }
    
    if pHeadPre == nil {    // 如果起始点为原链表第一个节点,终点为中间某节点,则只需要拼接翻转后的表的表尾节点和原链表中的n+1号节点
        pTempTail.Next = pTailNext
        return pTempHead
    } else if pTailNext == nil {    // 如果起始点为原链表中某个节点(非第一个),终点为原链表的终点,则只需要拼接原链表的m-1号节点和翻转后的表的表头节点
        pHeadPre.Next = pTempHead
        return head
    } else {    // 如果从中间某段开始反转,则头尾都要拼接
        pHeadPre.Next = pTempHead
        pTempTail.Next = pTailNext
        return head
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1151248次浏览 17148人参与
# 通信和硬件还有转码的必要吗 #
11198次浏览 101人参与
# 不去互联网可以去金融科技 #
20339次浏览 255人参与
# 和牛牛一起刷题打卡 #
18911次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203356次浏览 3625人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4970次浏览 30人参与
# OPPO开奖 #
19197次浏览 267人参与
# 通信硬件薪资爆料 #
265883次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2220次浏览 34人参与
# 互联网公司评价 #
97676次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25034次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454829次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53896次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14643次浏览 349人参与
# 硬件人的简历怎么写 #
82285次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19394次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28065次浏览 248人参与
# 学历对求职的影响 #
161226次浏览 1804人参与
# 你收到了团子的OC了吗 #
538685次浏览 6386人参与
# 你已经投递多少份简历了 #
344184次浏览 4963人参与
# 实习生应该准时下班吗 #
96965次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63518次浏览 622人参与
牛客网
牛客企业服务