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反转链表的主要内容,如果未能解决你的问题,请参考以下文章