LeetCode之反转链表

题目:

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

迭代法

该题迭代法主要思想是从头到尾依次改变指针的方向。

  • 设置3个指针(java无指针,这里暂且称指针)pre,cur,nextNode,初始值如下图:
    在这里插入图片描述

  • 开始循环修改指针,nextNode指针是为了记录断开后的首结点,而pre指针是为了记录指针将要指向的结点。(图上3有误,应为cur = nextNode)
    在这里插入图片描述

  • 终止条件如下图,当nextNode=null时,终止循环。
    在这里插入图片描述

  • 最后直接将cur.next指向pre,返回cur。

参考代码:

public static ListNode reverseList(ListNode head) {
  //注意判断是否为null
  if(head == null ||  head.next == null)return head;
  //初始化各个指针
  ListNode pre = null;
  ListNode curr = head;
  ListNode nextNode = curr.next;
  
  //开始改变指针
  while(nextNode != null){
   curr.next = pre;
   pre = curr;
   curr = nextNode;
   nextNode = nextNode.next;
  }
  curr.next = pre;
  return curr;
 }

递归法:

public static ListNode reverseList(ListNode head) {
  if(head == null ||  head.next == null)return head;
  //递归到最后一个节点时,返回该节点
  ListNode p = reverseList(head.next);
  //将指针转向
  head.next.next = head;
  //去掉环
  head.next = null;
  //每次递归都将最后一个节点返回,最后返回的p就为变换后的首节点
  return p;
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值