题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围 [0, 100] 内
- 0 <= Node.val <= 100
思路
这个思路其实就是两两交换,要熟悉链表的特性,它的每个节点就相当于一个指针,指向下一个节点。
方法一:
利用递归。
交换第二节点的next节点指向递归头节点。
第二节点的next节点指向第一节点,返回第二节点,这样第一节点的下一节点就为交换后的节点。
最后第二节点的next节点指向第一节点,即为需要的交换后的node
class Solution(object):
def swapPairs(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return head
temp1 = head
temp2 = head.next
temp1.next = self.swapPairs(temp2.next)
temp2.next =temp1
return temp2
方法二:
利用迭代。
这里记录一个大大比较牛的做法,将该类别的题目设一个条件key来trigger,本题是两两交换,target 设2,其他同理。
思路很清晰,构造一个主node,一个临时node 来存取中间节点的变化。
class Solution(object):
def swapPairs(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
l1 = ListNode(-1)
target = 2
p = l1
count = 0
while head and count < target:
q = head
head = head.next
q.next = p.next
p.next = q #将首节点的val赋值给临时node p,下一次循环进来就可以与q两两交换
count += 1
if count == target: #target相等,意味着达到交换次数,临时node p赋值空(只保留一位节点)
while p.next:
p = p.next
count = 0
return l1.next