题目
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
题解:
翻转链表记录当前结点的前一节点pre,临时保存当前结点的下一节点t,然后当前结点的next为pre,pre=当前结点,当前结点=t,这样就达到了翻转的效果。
此题由于不是从头到尾直接翻转,而是只翻转从m->n这些节点,需要注意细节,分情况讨论。
ListNode* reverseBetween(ListNode* head, int m, int n) {
//当m==n,说明不用翻转,直接返回
if(m==n)
return head;
//当前节点
ListNode* tmp = head;
//记录m的前一个节点
ListNode* pre_m = NULL;
// 记录翻转时所用到的前一个节点
ListNode* pre = NULL;
// 记录m节点
ListNode* t_m =NULL;
//遍历的节点数
int i=1;
while(true)
{
if(i<m)
{
pre_m = tmp;
tmp = tmp->next;
}
else if(i==m)
{
pre = tmp;
t_m = tmp;
tmp = tmp->next;
}
else if(i>m&&i<n)
{
//翻转指针
ListNode* t = tmp->next;
tmp->next = pre;
pre = tmp;
tmp = t;
}
else if(i==n)
{
//当pre_m为空说明hh头节点应该指向tmp,否则就是pre_m节点xx指向tmp
if(pre_m==NULL)
head = tmp;
else
pre_m->next = tmp;
ListNode* t = tmp->next;
tmp->next = pre;
t_m->next = t;
break;
}
i++;
}
return head;
}
京公网安备 11010502036488号