二刷复习
文章目录
- 二刷复习
- 24.两两交换链表中的结点
- 19.删除链表的倒数第n个结点
- 链表相交
- 环形链表2
24.两两交换链表中的结点
思路还是挺简单的,在纸上画一个图就行了
思考的过程:
1.我会思考需要用一个指针curr还是两个指针prev和curr,思考的结果是一个curr就够了
2.我接下来会思考用不用dummy_head,思考的结果是用,方便操作头结点
3.我接下来就考虑指针是怎么指的,怎么断开,又怎么连,需要提前保存一下哪些指针
4.我接下来思考curr指针是怎么移动的以及,while怎么写。这一步我出错了,我一开始写的是 while curr.next.next: 后来报错nonetype;这一点应该属于是首先你要保证while curr.next, 就是头结点都没的情况 直接不进循环逻辑直接return dummy_head.next, 其次你再保证curr.next.next,就是只有一个头结点的情况也直接返回dummy_head。
所以循环条件是
while curr.next and curr.next
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummy_head = ListNode(next=head)
curr = dummy_head
while curr.next and curr.next.next:
tmp1 = curr.next
tmp2 = curr.next.next.next
curr.next = curr.next.next
curr.next.next = tmp1
curr.next.next.next = tmp2
curr = curr.next.next
return dummy_head.next
19.删除链表的倒数第n个结点
19.删除链表的倒数第n个结点
这道题的难点在于找到倒数第n个结点前一个结点的位置,之所以找不到是因为不能获知链表的长度
解法是双指针,
fast先走n+1步, 然后slow再和它一起走直到fast指向None
此时slow指向的就是倒数第n+1个结点,就可以直接操作指针了
这个思路一定要记住
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
dummy = ListNode(next=head)
slow, fast = dummy, dummy
while n+1:
fast = fast.next
n -= 1
while fast:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return dummy.next
链表相交
链表相交
这个题的思路十分简单,
可以把一条链表完全加进一个set或者hash表(这两个底层都是一样的);然后遍历另外一支,如果发现遍历的另外一支中有出现在set里的就return 那个指针 否则就return None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
a = set()
curr_a = headA
while curr_a:
a.add(curr_a)
curr_a = curr_a.next
curr_b = headB
while curr_b:
if curr_b in a: return curr_b
else:
curr_b = curr_b.next
return None
环形链表2
环形链表2
不管是环形链表2还是链表相交思路都是一样的
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
a = set()
curr = head
while curr:
a.add(curr)
curr = curr.next
if curr in a: return curr
return None