昨天问到,若 input 为 [1,2,3] 那麽 output 为 [2,1,3] 还是 [1,3,2] ?
我们使用 迭代/递回 来解这个题目
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
# 先储存一个
dummy = ListNode(0)
dummy.next = head
current = dummy
while current.next != None and current.next.next != None:
# first 跟 second 储存准备交换的 Node
first = current.next
second = current.next.next
# 先把 first Node 指向 second 的下一个Node
first.next = second.next
# 先把 second Node 指向 first 的下一个Node
second.next = first
# 先把 second Node 指向 即将变成第一个点的 second 的下一个Node
current.next = second
# 把 current 跳到 first 的位置
current = first
return dummy.next
我们需要输出两两交换位置後的 linked list:
利用此递回关系,我们不断将问题化简成较短的 list ,直到 list 长度为 0 或 1 时,我们终於可以知道答案:
综合以上发现我们可以列出递回关系式。为了方便表示,此处用一般的 list 进行表示,并且以 node_i+1 表示 node_i 所指向的下一个节点:
其中,前两种 case 为终止条件,第三个 case 为递回关系。
有了递回关系式,我们便可以撰写程序:
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
# head 指向第一个位置,若为空,则回传 None
if head is None: return None
# second 指向第二个位置,若为空,则回传 None
second = head.next
if second is None: return head
# rest 指向剩下的位置 (就是第二个位置之後)
rest = second.next
# 交换前 [head, second, rest...] -> 交换後 [second, head, rest...]
# 第二个指向第一个,第一个指向剩下的
second.next = head
head.next = self.swapPairs(rest)
return second
<<: JavaScript入门 Day10_有关数字的语法2
成功打造好一个让团队感觉安全、平静的环境,是否就以足够?当然不是。接下来,我们来谈谈人的管理 — 如...
上一篇说到 JavaScript 原始型别与物件型别,我想今天试着来讨论「传值」与「传址」;在其他程...
为了与 SONY 的 PS4 相抗衡、基於过去的策略、微软也选择在几乎相同的时间发布了他们的新主机 ...
SAN - 网路上的硬碟 我的工作就是开发公司的SAN产品,所以对他比较了解 SAN就是空出一个网...
Day 31 - 使用 Amazon API Gateway 上传图片到 S3 建立 S3 储存贮体...