1-b.链表逆序2

2018-06-05  本文已影响11人  编程半岛

已知链表头结点指针head,将链表从位置m到n逆序。(不可申请额外空间)

解题思路:




思考:最终结果应该返回哪个节点? 如果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++版本

上一篇 下一篇

猜你喜欢

热点阅读