1、思路
-
需要得到四个节点的位置:反转链表的前一个节点
before
,反转链表的起始节点start
,反转链表的末尾结点end
以及反转链表末尾结点的后一个节点after
; -
将
start
与end
之间的链表进行反转,反转后end
变成了表头,start
变成了表尾; -
最后再将这四个节点连接起来即可。
2、代码
list_node * reverse_list(list_node * head, int L, int R)
{
if (head == nullptr || head->next == nullptr) return head;
auto dummy = new list_node; //定义虚拟头结点,因为反转链表可能从第一个元素开始
dummy->next = head;
auto before = dummy, end = head; //注意before与end的初始位置
while ( -- L && before->next != nullptr) before = before->next;
while ( -- R && end->next != nullptr) end = end->next;
auto start = before->next, after = end->next;
auto pre = start, cur = start->next; //反转链表的模板
while (cur != after)
{
auto ne = cur->next;
cur->next = pre;
pre = cur, cur = ne;
}
before->next = end; //连接表头
start->next = after; //连接表尾
return dummy->next;
}