反转链表II题目
关键点
其实反转链表II相对于反转链表(leetcode-206)来说关键就是记录一些关键的结点:
pre结点(m-n部分反转后的链表头结点的前置结点,即是m-1位置的那个结点)
tail结点(m-n部分反转后的链表的尾结点,即是m位置的那个结点)
图解流程
下图为示例的详细过程
代码(Go语言)
type ListNode struct {
Val int
Next *ListNode
}
func reverseBetween(head *ListNode, m int, n int) *ListNode {
if head == nil || m == n {
return head
}
guard := &ListNode{Val: -1}
guard.Next = head
cur := guard
pre := guard
tail := guard
var newNode *ListNode
index := 0
for cur != nil && index <= n{
curNext := cur.Next
if index < m{
pre = cur
}
if index >= m {
if index == m {
tail = cur
}
cur.Next = newNode
newNode = cur
}
index++
cur = curNext
}
tail.Next = cur
pre.Next = newNode
return guard.Next
}