题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
我的方法:
看起来并不算很难,重点应该在于理顺整个处理流程。
- 将节点分为两两一组,每次处理两个节点。
- 对于头两个节点,交换两个节点后,只需要考虑整体的之后节点即可。
- 对于中间的节点,交换两个节点后,要考虑整体之前的节点以及整体之后的节点。
- 如果最终有节点落单,则不进行交换操作。
战绩一般:执行用时 : 32 ms, 在Swap Nodes in Pairs的Python提交中击败了9.28% 的用户。内存消耗 : 11.6 MB, 在Swap Nodes in Pairs的Python提交中击败了0.00% 的用户。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def swapPairs(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head is None or head.next is None:
return head
# 如果长度在2以上
p=head.next
pre=None
# 遍历链表
while head:
# 两两节点为一组,进行处理
a=head
b=a.next
if b:
head=b.next #链表要持续移动
#交换两个节点
if pre:
pre.next=b
b.next=a
else:
b.next=a
a.next=None #不要形成环链
pre=a
else:
head=b#链表要持续移动
if pre:
pre.next=a
return p
别人的方法:
看了下别人的方法,确实很简洁。看起来是用的递归,没错,这个问题用递归解决很适合。
class Solution(object):
def swapPairs(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return head
chead = self.swapPairs(head.next.next)
hnext = head.next
head.next, hnext.next = chead, head
return hnext
网友评论