指定区间反转
我的想法:
将需要反转的区间单独拿出来,反转的同时拼接回去
我的遗漏点:
1.拿出去的链表后面没有NULL,藕断丝连,导致链表出现环
2.拿出去的链表插到原来的里面进去的时候忘记改变前面的next指针
3.没有考虑如果从表头开始反转的情况,后来用了虚拟结点。
def reverseBetween(self, head, left, right):
if left == right:
return head
prehead = ListNode(-1)
prehead.next = head
slow, last = prehead, prehead
for i in range(0, left - 1):
slow = slow.next
for i in range(0, right):
last = last.next
cur = slow.next
slow.next = last.next
prev = slow.next
last.next = None
while cur:
next = cur.next
cur.next = prev
prev = cur
slow.next = prev
cur = next
return prehead.next
头插法
整体思想:在需要反转的区间里,让这个新节点来到反转的起始位置。
def reverseBetween(self, head, left, right):
dummy_node=ListNode(-1)
dummy_node.next=head
pre=dummy_node
for _ in range(left-1):
pre=pre.next
cur=pre.next
for _ in range(right-left):
next=cur.next
cur.next=next.next
next.next=pre.next
pre.next=next
return dummy_node.next
穿针引线法
思想:三段式
想法:感觉比我的繁琐好多,还不如我的
def reverse_list(self,head):
pre=None
cur=head
while cur:
next=cur.next
cur.next=pre
pre=cur
cur=next
def reverseBetween(self,head,left,right):
dummy_node=ListNode(-1)
dummy_node.next=head
pre=dummy_node
for _ in range(left-1):
pre=pre.next
right_node=pre
for _ in range(right-left+1):
right_node=right_node.next
left_node=pre.enxt
curr=right_node.next
pre.next=None
right_node.next=None
self.reverse_list(left_node)
pre.next=right_node
left_node.next=curr
return dummy_node.next