86.分割链表
思路:将链表先分后合,分为较大的和较小的,每遍历到一个节点,确定添到哪个列表后面,最后两个链表首位相接
注意:创建两个伪头节点;别忘了最终的尾节点的next指针设为空
代码:
class Solution:
def partition(self, head: ListNode, x: int) -> ListNode:
if (head==None or head.next==None):return head
dummypre = ListNode(0)
dummytail=ListNode(0)
pre=dummypre
tail=dummytail
cur=head
while cur:
if cur.val < x:
pre.next = cur
pre = pre.next
else:
tail.next = cur
tail=tail.next
cur=cur.next
tail.next = None
pre.next = dummytail.next
return dummypre.next
92. 反转链表 II
思路:第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点
第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点
第 3 步:切断出一个子链表(截取链表)
第 4 步:同第 206 题,反转链表的子区间
第 5 步:接回到原来的链表中
注意:头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨
代码:
class Solution:
def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
def reverse(head):
pre=None
cur=head
while cur:
next=cur.next
cur.next = pre
pre = cur
cur=next
dummyHead = ListNode(-1)
dummyHead.next = head
pre = dummyHead
for _ in range(left - 1):
pre = pre.next
rightNode=pre
for _ in range(right - left + 1):
rightNode = rightNode.next
leftNode = pre.next
curr=rightNode.next
pre.next = None
rightNode.next = None
leftNode.next = reverse(leftNode)
pre.next=rightNode
leftNode.next=curr
return dummyHead.next