思路 根据图来理清思路 使用三个容器来储藏节点
将三个节点放进三个容器,分别修改每个容器的指针
while 当前节点的下两个节点不为空
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummy=ListNode(next=head)
cur=dummy
while cur.next and cur.next.next:
tmp1=cur.next
tmp2=cur.next.next
tmp3=cur.next.next.next
cur.next=tmp2
tmp2.next=tmp1
tmp1.next=tmp3
cur=tmp1
return dummy.next
思路
遍历每个节点来获取链表长度
让链表走到删除节点的上一个节点
修改指针
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
index=0
dummy=ListNode(next=head)
cur=dummy
while cur.next:
cur=cur.next
index+=1
cur=dummy
for i in range(index-n):
cur=cur.next
cur.next=cur.next.next
return dummy.next
思路
没想出来,借鉴了K的解法
双指针,指针在列表尾部则转移到另一条链表头
如果有公共节点,那么两个节点会相遇
否则会同时在null节点
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
A,B=headA,headB
while A!=B:
A=A.next if A else headB
B=B.next if B else headA
return A
思路
根据快慢指针,快指针走两步,慢指针走一步
快慢如果在环中相遇,快指针快n圈,此时慢指针走a步就能走到起点,将快指针移到起点位置
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
slow=head
fast=head
while True:
if fast and fast.next:
slow=slow.next
fast=fast.next.next
if fast==slow:
break
else:
return
fast=head
while fast!=slow:
fast,slow=fast.next,slow.next
return fast