当前位置: 首页 > wzjs >正文

企业网站设计风格东莞seo靠谱

企业网站设计风格,东莞seo靠谱,怎么做彩票游戏网站,建筑工程资质合作206.反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例 3&#…

206.反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

反转链表通常有两种方法:迭代法和递归法。

迭代法(双指针)

        假设原来的链表是1->2->3->4->5->null,反转后变成null<-1<-2<-3<-4<-5。那在迭代的时候,初始状态应该是prev=null,current=head。然后循环处理每个节点:                        

        在循环中,首先保存当前节点的下一个节点nextTemp,然后把当前节点的next指向prev。接着prev移动到current的位置,current移动到nextTemp的位置。直到current为null,此时prev就是新的头节点。

实现代码:

/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {ListNode current = head;ListNode prev = null;while (current != null) {ListNode nextTemp = current.next; // 保存下一个节点current.next = prev; /// 反转指针prev = current; // 前移prevcurrent = nextTemp; // 前移current}return prev; // prev即为新链表的头结点}
}

步骤解释:

  1. 初始化指针:使用两个指针prevcurrent,初始时prevnullcurrent指向头节点head

  2. 遍历链表:在current不为null时循环处理每个节点。

    • 保存下一个节点:临时存储current.nextnextTemp,防止反转指针后丢失后续节点。

    • 反转指针:将当前节点currentnext指向prev,完成当前节点的反转。

    • 移动指针:将prev移动到当前current的位置,current移动到之前保存的nextTemp位置。

  3. 返回新头节点:当循环结束时,currentnullprev指向原链表的最后一个节点,即反转后的新头节点。

递归法

递归方法的步骤如下:

  1. 递归终止条件:当前节点为空或下一个子节点为空,返回当前节点
  2. 递归反转后续链表,得到反转后的头结点
  3. 将当前节点的下一个节点的next指向当前节点,形成反转
  4. 将当前节点的next设为null,断开原来的连接
  5. 返回反转后的头结点

实现代码

class Solution {public ListNode reverseList(ListNode head) {// 递归法// 递归终止条件,空链表或单链表无需反转if (head == null || head.next == null) {return head;}// 递归反转后续链表,得到新头结点ListNode newHead = reverseList(head.next);// 调整指针方向,将当前节点的下一个节点的next指向自己head.next.next = head;// 断开当前节点的原指向,防止循环head.next = null;// 返回新头结点return newHead;}
}

示例分析

1. 递归调用栈展开

递归从头部节点 1 开始,逐层深入,直到链表末尾的节点 5。以下是调用栈的展开过程:

reverseList(1) → reverseList(2) → reverseList(3) → reverseList(4) → reverseList(5)

终止条件触发:当调用 reverseList(5) 时,5.next == null,直接返回 5(此时 newHead = 5)。

2. 递归回溯与指针调整

递归开始逐层回溯,每层处理当前节点并调整指针方向:

层 4(head = 4

  • 输入链表状态4 → 5

  • 操作步骤

    1. 收到下层返回的 newHead = 5

    2. 调整指针4.next.next = 4 → 5.next = 4(形成 5 → 4)。

    3. 断开原链4.next = null(防止 4 → 5 循环)。

  • 输出链表状态5 → 4 → null

  • 返回newHead = 5

层 3(head = 3

  • 输入链表状态3 → 4 → null(原链未修改时,3.next 仍指向 4)。

  • 操作步骤

    1. 收到下层返回的 newHead = 5

    2. 调整指针3.next.next = 3 → 4.next = 3(形成 5 → 4 → 3)。

    3. 断开原链3.next = null

  • 输出链表状态5 → 4 → 3 → null

  • 返回newHead = 5

层 2(head = 2

  • 输入链表状态2 → 3 → null(原链未修改时,2.next 指向 3)。

  • 操作步骤

    1. 收到下层返回的 newHead = 5

    2. 调整指针2.next.next = 2 → 3.next = 2(形成 5 → 4 → 3 → 2)。

    3. 断开原链2.next = null

  • 输出链表状态5 → 4 → 3 → 2 → null

  • 返回newHead = 5

层 1(head = 1

  • 输入链表状态1 → 2 → null(原链未修改时,1.next 指向 2)。

  • 操作步骤

    1. 收到下层返回的 newHead = 5

    2. 调整指针1.next.next = 1 → 2.next = 1(形成 5 → 4 → 3 → 2 → 1)。

    3. 断开原链1.next = null

  • 输出链表状态5 → 4 → 3 → 2 → 1 → null

  • 返回newHead = 5

总结

  1. 递归终止条件:处理到链表末尾时直接返回。

  2. 递归分解问题:假设后续链表已反转,只需调整当前节点和下一个节点的指针。

  3. 指针操作:通过 head.next.next = head 和 head.next = null 完成局部反转并断开原链。

http://www.dtcms.com/wzjs/318718.html

相关文章:

  • 牡丹江市建设行业协会网站网上国网推广
  • 办文明网站做文明网民活动方案seo优化公司哪家好
  • b2c的电子信息网站打开百度一下网页版
  • 网站备案号查询网站长数据
  • iis怎么搭建设计网站名优网站关键词优化
  • 华跃建筑人才网seo资料
  • php网站开发框架谷歌外贸平台叫什么
  • 做网站需要的导航郑州客串seo
  • 网站开发设计的源码关键词优化的建议
  • 合肥高端网站建设社会新闻热点事件
  • 品牌创意网站建设小红书搜索优化
  • 养生网站建设免费百度搜索网页版
  • 怎么做能收费的视频网站网上推广怎么弄?
  • 深圳市建设工程交易中心网站seo上海培训
  • 网站建设一般的流程大数据培训
  • 上海高端网站建设高端网站建设自媒体平台app
  • 高中做信息技术题网站品牌广告语经典100条
  • 如何在网站上添加qq宁波seo在线优化公司
  • 建一个门户网站网页设计可以自学吗
  • 做的网站手机打不开怎么回事啊微博营销案例
  • 日本创意产品设计案例奉节县关键词seo排名优化
  • 如何用网站首页做404今天特大军事新闻
  • 坪山网站建设价位深圳网站seo服务
  • 做网站报价单站长统计app软件下载官网
  • 重庆璧山网站建设网页设计与制作软件有哪些
  • 网站建设落后发言上海哪家seo好
  • 福州网站推广优化seo网站推广公司
  • 潜江资讯网信息发布云南网络营销seo
  • 网站建设的步骤是什么意思深圳谷歌seo推广
  • 模板自助建站网站制作重庆网站关键词排名优化