java反转链表

Posted 青春无敌美少

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反转链表相关的知识,希望对你有一定的参考价值。

1.题目

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0<=n<=10000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。

如当输入链表1,2,3时,
经反转后,原链表变为3,2,1,所以对应的输出为3,2,1。
以上转换过程如下图所示:

2.解题思路

2.1链表放入栈中

链表的反转中,我们可以用到栈先进后出的特点,将原链表中的结点按顺序放入栈中,之后将栈中的元素取出,连接成链表。

/*
public class ListNode 
    int val;
    ListNode next = null;

    ListNode(int val) 
        this.val = val;
    
*/
import java.util.Stack;
public class Solution 
    public ListNode ReverseList(ListNode head) 
        Stack<ListNode> stack=new Stack<>();
        //将链表中的结点放入栈中
        while(head!=null)
            stack.push(head);
            head=head.next;
        
        //如果栈为空,证明链表为空
        if(stack.isEmpty())
        return null;
        //链表不为空时,表头为node,next为后一个结点
        ListNode node=stack.pop();
        ListNode next=node;
        while(!stack.isEmpty())
            ListNode tmp=stack.pop();
            next.next=tmp;
            next=next.next;
        
        next.next=null;
        return node;
    


2.2迭代法

我们在原链表中更改结点之间的指向,即可完成对链表的反转。

/*
public class ListNode 
    int val;
    ListNode next = null;

    ListNode(int val) 
        this.val = val;
    
*/
public class Solution 
    public ListNode ReverseList(ListNode head) 
        //pre指针:用来指向反转后的节点,初始化为null
        ListNode pre = null;
         //当前节点指针
        ListNode cur = head;
        //循环迭代
        while(cur!=null)
            //Cur_next 节点,永远指向当前节点cur的下一个节点
            ListNode Cur_next = cur.next;
            //反转的关键:当前的节点指向其前一个节点(注意这不是双向链表,没有前驱指针)
            cur.next = pre;
            //更新pre
            pre = cur;
            //更新当前节点指针
            cur = Cur_next ;
        
        //为什么返回pre?因为pre是反转之后的头节点
        return pre;
    

以上是关于java反转链表的主要内容,如果未能解决你的问题,请参考以下文章

java牛客BM1.反转链表

java牛客BM1.反转链表

剑指Offer链表反转链表

AcWing33:反转链表

AcWing33:反转链表

AcWing33:反转链表