题目描述
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
解题思路
- m可能为0,造一个假链表头
- 遍历链表,找到第m个节点。同时保存m的前一个节点
- 保存第m个节点,然后将第m到n个节点反转
- 反转之后第n个节点为反转链表的头,第m个节点为反转链表尾
- 将第n个节点连接到m的前一个节点,将当前遍历到的节点链接到第m个节点
- 注意反转时需要遍历到第n个节点,下标是从假链表头开始的,因此index <= n
代码实现
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseBetween(head *ListNode, m int, n int) *ListNode {
res := &ListNode{Val: 0}
res.Next = head
head = res
index := 0
var pre *ListNode
for head != nil && index < m {
pre = head
head = head.Next
index++
}
mid := head
var tail *ListNode
for head != nil && index <= n {
temp := head.Next
head.Next = tail
tail = head
head = temp
index++
}
pre.Next = tail
mid.Next = head
return res.Next
}