ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

数据结构与算法--链表翻转

2022-07-19 23:36:29  阅读:196  来源: 互联网

标签:pre Node 结点 curr -- next 链表 数据结构


简介

单链表的反转,面试中的一个高频题目。当然也有很多变体,比如以k个结点为一组进行翻转链表的

需求

原链表中数据为:1->2->3->4

反转后链表中数据为:4->3->2->1


实现

反转链表是有2种方法(递归法,遍历法)实现的

节点类设计

public class Node{

    /**存储元素*/
    public T item;

    /**记录下一个节点*/
    public Node next;

    public Node(T t,Node next){
        this.item = t;
        this.next = next;
    }
 }

方式一:递归实现

递归反转其实就是从原链表的第一个存数据的结点开始,依次递归调用反转每一个结点, 直到把最后一个结点反转完毕,整个链表就反转完毕

public void reverse(){
    
    //如果当前是空链表,不需要反转
    if(this.n == 0){
        return ;
    }
    
    reverse(head.next);
}

/**反转指定的结点curr,并把反转后的结点返回*/
public Node reverse(Node curr){
    
    //已经到了最后一个元素
    if(curr.next == null){
        //反转后,头结点应该指向原链表中的最后一个元素
        head.next = curr;
        return curr;
    }
    
    //递归的反转当前结点curr的下一个结点;返回值就是链表反转后,当前结点的上一个结点
    Node pre = reverse(curr.next);
    
    //让返回的结点的下一个结点变为当前结点curr
    pre.next = curr;
    
    //把当前结点的下一个结点变为null
    curr.next = null;
    
    return curr;
}

递归实质上就是系统帮你压栈的过程,系统在压栈的时候会保留现场

  1. 程序到达Node pre= reverse(curr.next);时进入递归

  2. 假设此时递归到了3结点,此时curr=3结点,curr=3结点.next(实际上是4结点)

  3. 执行 Node pre= reverse(cur.next);传入的curr.next是4结点,返回的curr是4结点

接下来就是弹栈过程了

  • 程序继续执行 pre.next = curr 就相当于4->3

  • curr.next = null 即把3结点指向4结点的指针断掉

  • 返回新链表的头结点curr

注意:当retuen后,系统会恢复2结点压栈时的现场,此时的curr=2结点;curr=2结点.next(3结点),再进行上述的操作

最后完成整个链表的翻转

 方式二:循环遍历实现

 遍历法就是在链表遍历的过程中将指针顺序置换

遍历过程

  1. 准备两个空结点 pre 用来保存先前结点、next 用来做临时变量

  2. 在头结点 node 遍历的时候此时为1结点

    next = 1结点.next(2结点)

    1结点.next=pre(null)

    pre = 1结点

    node = 2结点

  3. 进行下一次循环node=2结点

    next = 2结点.next(3结点)

    2结点.next=pre(1结点)=>即完成2->1

    pre = 2结点

    node = 3结点

  1. 进行循环...

public Node reverseList(Node node) {
    
    Node pre = null;
    
    Node next = null;
    
    while (node != null) {
        
        //永远指向当前节点cur的下一个节点
        next = node.next;
        
        //反转的关键:当前的节点指向其前一个节点
        node.next = pre;
        
        //更新pre和当前结点
        pre = node;
        node = next;
    }
    
    //pre是反转之后的头节点
    return pre;
}

标签:pre,Node,结点,curr,--,next,链表,数据结构
来源: https://www.cnblogs.com/52-IT-y/p/16496214.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有