内容简介:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3. 复制代码
解题方案
思路
- 标签:链表
- 本题的递归和非递归解法其实原理类似,都是更新每两个点的链表形态完成整个链表的调整
- 其中递归解法可以作为典型的递归解决思路进行讲解
递归写法要观察本级递归的解决过程,形成抽象模型, 因为递归本质就是不断重复相同的事情 。而不是去思考完整的调用栈,一级又一级,无从下手。如图所示,我们应该关注一级调用小单元的情况,也就是单个f(x)。
其中我们应该关心的主要有三点:
- 返回值
- 调用单元做了什么
- 终止条件
在本题中:
- 返回值:交换完成的子链表
- 调用单元:设需要交换的两个点为head和next,head连接后面交换完成的子链表,next连接head,完成交换
- 终止条件:head为空指针或者next为空指针,也就是当前无节点或者只有一个节点,无法进行交换
代码
递归解法
class Solution { public ListNode swapPairs(ListNode head) { if(head == null || head.next == null){ return head; } ListNode next = head.next; head.next = swapPairs(next.next); next.next = head; return next; } } 复制代码
非递归解法
class Solution { public ListNode swapPairs(ListNode head) { ListNode pre = new ListNode(0); pre.next = head; ListNode temp = pre; while(temp.next != null && temp.next.next != null) { ListNode start = temp.next; ListNode end = temp.next.next; temp.next = end; start.next = end.next; end.next = start; temp = start; } return pre.next; } } 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- POC分布式节点算法机制下的超级节点计划
- G6 v3.5 发布:全新节点分组与图算法
- 宝塔面板+Fikker+BBR算法+CloudXNS---搭建一个简易的全球CDN缓存节点给网站加速
- xml创建节点(根节点、子节点)
- Vultr VPS 节点选择方法 | 各节点延迟一览
- 1.19 JQuery2:节点插入与节点选取
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。