已知链表头结点指针head
,将链表从位置m到n逆序。(不可申请额外空间)
![](https://img.haomeiwen.com/i5600819/4faf751513edc940.png)
解题思路:
![](https://img.haomeiwen.com/i5600819/4565b903d94e9f44.png)
![](https://img.haomeiwen.com/i5600819/1990560acb6a742a.png)
![](https://img.haomeiwen.com/i5600819/79a50d37e40a25fa.png)
![](https://img.haomeiwen.com/i5600819/2d442424220d8bd6.png)
思考:最终结果应该返回哪个节点? 如果m==1时,有什么特殊?
如果m==1时,返回new_head结点。
关键代码:
ListNode* reverseBetweenM2N(ListNode* head, int m, int n)
{
int change_len = n - m + 1; // 计算需要逆置的节点个数
ListNode* pre_head = NULL; // 初始化开始逆置的节点的前驱
ListNode* result = head; // 最终转换后的链表头节点,非特殊情况即为head
while( head && --m) // 将head先前移动m-1个位置
{
pre_head = head; // 记录head的前驱:pre_head
head = head->next;
}
ListNode* modify_list_tail = head; // 将modify_list_tail指向当前的head,即逆置后的链表尾
ListNode* new_head = NULL;
while( head && change_len ) // 逆置change_len个节点
{
ListNode* next = head->next;
head->next = new_head;
new_head = head;
head = next;
change_len--;
}
modify_list_tail->next = head; // 连接逆置后的链表尾与逆置段的后一个节点
if ( pre_head ) // 如果pre_head不为空,说明不是从第一个节点开始逆置的
{
pre_head->next = new_head; // 连接pre_head与逆置后的头节点
}
else
{
result = new_head; // 如果pre_head为空,说明m==1,从第一个节点开始逆置,结果即为逆置后的头节点
}
}
完成版:
c++版本
网友评论