143. 重排链表
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例1:给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例2:给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
class Solution(object): def reorderList(self, head): if not head: return head slow = head fast = head #利用快慢指针找到中点(链表中经常用到"快慢指针"种方法,应掌握!!!) while fast and fast.next: slow = slow.next fast = fast.next.next #slow为找到的中点,将slow后的链表进行反转为rev链表 rev = self.reverse(slow.next) slow.next = None #切断链表,原链表到slow就结束了 #将反转的链表rev中的每一项项插入原链表 cur = head while cur and rev: temp1 = cur.next temp2 = rev.next cur.next = rev rev.next = temp1 rev = temp2 cur = temp1 def reverse(self, head): #反转链表(基本操作,要熟练写出!!!) pre = None cur = head while cur: lat = cur.next cur.next = pre pre = cur cur = lat return pre
#利用栈来实现,代码量较少,但是leetcode上用时大 if not head or not head.next: return head cur = head stack = [] while cur: stack.append(cur) cur = cur.next cur = stack.pop(0) #栈底 while stack: cur.next = stack.pop() #栈顶 cur = cur.next if stack: cur.next = stack.pop(0) cur=cur.next cur.next = None