思路:利用栈(自己想的)

  1. 设置两个栈,一个odd_stack,存放序号为奇数的节点,一个even_stack,存放序号为偶数的节点,遍历所有节点,依次将相应的节点放入两个栈。
  2. 设置pre指针,如果两个栈内节点数量相等,pre设为None;如果不相等(一定是odd_stack比even_stack多一个),从odd_stack中pop出一个节点(即链表的最后一个节点,没有和它相互交换的节点),将这个节点作为pre,此时两个栈的节点数量是相等的了。
  3. 当2个栈都非空时,每次同时从两个栈中pop出一个节点,even_stack中pop出的节点cur作为前面的节点,odd_stack中pop出的节点post作为后面的节点,这样就实现了相邻节点的两两交换。然后post的下一个节点设为pre,再将pre更新为cur。
  4. 最后返回cur即为全部交换后的链表头。 alt
# 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