给定一个单链表L: L0→L1→…→Ln-1→Ln,
重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…
必须在不改变节点值的情况下进行原地操作。
样例
给出链表 1->2->3->4->null
,重新排列后为1->4->2->3->null
。
思路:
将链表一分为二,后半段逆序插入前半段。
参考九章:使用快慢指针(在判断链表是否含环路时使用过)
class Solution: """ @param head: The first node of the linked list. @return: nothing """ def reorderList(self, head): # write your code here if None == head or None == head.next: return head pfast = head pslow = head while pfast.next and pfast.next.next: pfast = pfast.next.next pslow = pslow.next pfast = pslow.next pslow.next = None #此时pfast指向中间元素的后一个元素,pslow指向中间元素。已将链表一分为二 pnext = pfast.next #辅助指针,用于逆置后半段链表 pfast.next = None while pnext: #将后半段逆置,逆置完pnext为空,pfast为最后一个元素 q = pnext.next pnext.next = pfast pfast = pnext pnext = q tail = head while pfast: #将后半段合并插入前半段 pnext = pfast.next pfast.next = tail.next tail.next = pfast tail = tail.next.next pfast = pnext return head
这题难度在于不能使用额外空间,需仔细考虑指针的指向,需要多个辅助指针帮助逆置合并等操作