思路:利用栈(自己想的)
- 设置两个栈,一个odd_stack,存放序号为奇数的节点,一个even_stack,存放序号为偶数的节点,遍历所有节点,依次将相应的节点放入两个栈。
- 设置pre指针,如果两个栈内节点数量相等,pre设为None;如果不相等(一定是odd_stack比even_stack多一个),从odd_stack中pop出一个节点(即链表的最后一个节点,没有和它相互交换的节点),将这个节点作为pre,此时两个栈的节点数量是相等的了。
- 当2个栈都非空时,每次同时从两个栈中pop出一个节点,even_stack中pop出的节点cur作为前面的节点,odd_stack中pop出的节点post作为后面的节点,这样就实现了相邻节点的两两交换。然后post的下一个节点设为pre,再将pre更新为cur。
- 最后返回cur即为全部交换后的链表头。
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
even_stack = []
odd_stack = []
cur = head
i = 1
while cur:
if i%2 == 0:
even_stack.append(cur)
i += 1
cur = cur.next
else:
odd_stack.append(cur)
i += 1
cur = cur.next
if len(odd_stack) == len(even_stack):
pre = None
else:
pre = odd_stack.pop()
while even_stack and odd_stack:
cur = even_stack.pop()
post = odd_stack.pop()
cur.next = post
post.next = pre
pre = cur
return cur