反转链表

头插法反转链表

通过三指针,分别保存当前节点指针,前节点指针,后节点指针,每次移动一位来反转当前节点 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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述输入一个链表,反转链表后,输出新链表的表头。 问题分析要正确的反转链表,需要调整指针的方向,为了更好的描述...
    ProudLin阅读 1,339评论 0 0
  • 反转链表、环形链表和删除某一个节点 查看关于网上的一些反转链表的思路,发现步骤十分复杂,在学习了小码哥的数据结构以...
    YYFast阅读 4,554评论 0 0
  • 链表这部分最常见的就是链表反转,这里主要针对三种题型来对链表的反转问题进行了讲解。分别对应leetcode中的题目...
    simples阅读 3,265评论 0 0
  • 解题思路(参考官方题解,加上自己的一些思考) 解法一:迭代法 在遍历链表时,将当前节点的next指针改为指向前一个...
    等不了天明等时光阅读 891评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 12,727评论 28 53