反转链表的三种解法

6 篇文章 0 订阅

1. 双链表求解法

  双链表求解法是吧原链表的节点一个个摘掉,每次摘掉的节点都让他成为新链表的头节点,然后更新。用一些示意图展示一下

 

 

 

 以此类推

function ReverseList(head)
{    
   let newHead = null;
    while(head!=null){
          let tmp = head.next;
          head.next = newHead;
          newHead = head;
          head = tmp;
    }
    return newHead;
    
}

2.使用栈这种数据结构解决问题

先将链表全部入栈,再一个个出栈组成链表,这样就是逆序的了

 

 

 

function ReverseList(head)
{    
 let stack = []
 
 while(head!=null){
     stack.push(head)   
     head = head.next
 }
 if(stack.length ===0){
     return null;
 }   
  let node = stack.pop()
  let dummy = node;
    
  while(stack.length!==0){
        
      let tmp = stack.pop()
      node.next = tmp;
      node = node.next;
  } 
    //防止有环
    node.next = null;
    
    return dummy;
    
}

 3.递归做法

通过递归遍历到尾节点 以尾节点为头,然后保存首节点的下一个节点,开始递归反向链接节点

function ReverseList(head)
{    
  if(head== null || head.next==null)
      return head
  let next = head.next
  
  let reverseHead = ReverseList(next)
  //head是本次递归调用传进来的节点 next是本次节点的下一个节点
 // next.next逆序链接节点
  next.next = head;
  
  //head是尾节点 防止有环 
   head.next = null;
   return reverseHead
    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值