206. 反转链表

111 阅读1分钟
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

ListNode* reverseKGroup(ListNode* head, int k) {
    //hair结点是heard头结点之前的结点
    ListNode* hair = new ListNode(0);
    hair->next = head;
    //pre为子链heard的前一个
    ListNode* pre = hair;
    //遍历结点
    while (head) {
        // 每次遍历,tail从pre开始向后走k步。如果不满k个,即tail为空,则返回成功。
        ListNode* tail = pre;
        // 查看剩余部分长度是否大于等于k
        for (int i = 0; i < k; ++i) {
            tail = tail->next;
            if (!tail) {
                return hair->next;
            }
        }
        ListNode* nex = tail->next;//nex保存子链的下一个
        tie(head, tail) = myReverse(head, tail);//翻转head到tail的链表
        // 把子链表重新接回原链表
        pre->next = head;
        tail->next = nex;
        // 移动pre指向下一个子链头的前一个
        pre = tail;
        // 移动heard指向下一个子链头
        head = tail->next;
    }
    return hair->next;
}