美文网首页
反转链表

反转链表

作者: 别点了填写不了昵称 | 来源:发表于2021-06-17 22:49 被阅读0次

    头插法反转链表

    通过三指针,分别保存当前节点指针,前节点指针,后节点指针,每次移动一位来反转当前节点 next 指针的指向(将next指向pre)。

    public ListNode reverseList(ListNode head) {
            ListNode cur = head;
            ListNode pre = null;
            ListNode next = null;
    
            while(cur != null){
                next = cur.next;
                cur.next = pre;
                pre = cur;
                cur = next;
            }
            
            return pre;
        }
    

    递归反转链表

      //迭代反转法,head 为无头节点链表的头指针
      link * iteration_reverse(link* head) {
        if (head == NULL || head->next == NULL) {
            return head;
        }
        else {
            link * beg = NULL;
            link * mid = head;
            link * end = head->next;
            //一直遍历
            while (1)
            {
                //修改 mid 所指节点的指向
                mid->next = beg;
                //此时判断 end 是否为 NULL,如果成立则退出循环
                if (end == NULL) {
                    break;
                }
                //整体向后移动 3 个指针
                beg = mid;
                mid = end;
                end = end->next;
            }
            //最后修改 head 头指针的指向
            head = mid;
            return head;
        }
    }
    

    迭代反转链表

    
      link* recursive_reverse(link* head) {
        //递归的出口
        if (head == NULL || head->next == NULL)     // 空链或只有一个结点,直接返回头指针
        {
            return head;
        }
        else
        {
            //一直递归,找到链表中最后一个节点
            link *new_head = recursive_reverse(head->next);
            //当逐层退出时,new_head 的指向都不变,一直指向原链表中最后一个节点;
            //递归每退出一层,函数中 head 指针的指向都会发生改变,都指向上一个节点。
            //每退出一层,都需要改变 head->next 节点指针域的指向,同时令 head 所指节点的指针域为 NULL。
            head->next->next = head;
            head->next = NULL;
            //每一层递归结束,都要将新的头指针返回给上一层。由此,即可保证整个递归过程中,能够一直找得到新链表的表头。
            return new_head;
        }
    }
    

    就地逆置法反转链表

     link * local_reverse(link * head) {
        link * beg = NULL;
        link * end = NULL;
        if (head == NULL || head->next == NULL) {
            return head;
        }
        beg = head;
        end = head->next;
        while (end != NULL) {
            //将 end 从链表中摘除
            beg->next = end->next;
            //将 end 移动至链表头
            end->next = head;
            head = end;
            //调整 end 的指向,另其指向 beg 后的一个节点,为反转下一个节点做准备
            end = beg->next;
        }
        return head;
    }
    

    参考文章

    当前文章会将用java代码实现全部,当前还未完成,处于完善阶段,参考文章:http://c.biancheng.net/view/8105.html

    相关文章

      网友评论

          本文标题:反转链表

          本文链接:https://www.haomeiwen.com/subject/lushyltx.html