一个指针用于遍历链表,一个指针用于记录反转后的链表
def reverseList(head):
#链表反转
if not head:
return head
current = head #当前结点
previous = None #reversed链表
while current:
nextnode = current.next
current.next = previous
previous = current
current = nextnode
return previous
使用快慢指针,慢指针步长为1,快指针步长为2,若存在环则经过一定循环次数后快指针与慢指针会指向同一结点
def hasCycle(self, head):
#判断循环链
if not head:
return False
slow=fast=head
while slow and fast:
slow = slow.next
fast = fast.next
if fast:
fast = fast.next
if slow is fast:
return True
return False
较为基础的解法
def mergeTwoLists(l1, l2):
#对排序好的链表合并
if not l1:
return l2
if not l2:
return l1
if l1.val<=l2.val:
head = l1
l1 = l1.next
else:
head = l2
l2 = l2.next
p = head
while l1 and l2:
if l1.val<=l2.val:
p.next = l1
l1 = l1.next
else:
p.next = l2
l2 = l2.next
p = p.next
if not l1:
p.next = l2
else:
p.next = l1
return head
利用快慢指针,慢指针步长为1快指针步长为2,当快指针到达尾结点时慢结点恰好到中点。
def middleNode(self, head):
fast = head
while fast and fast.next:
head = head.next
fast = fast.next.next
return head
先使用一个指针a往前n步,b指针在头结点不动。然后a,b指针再同时往前,当a到达尾结点时b指针恰好指向倒数第n个结点。再进行删除操作。
def removeNthFromEnd(self, head, n):
runner = head
slow = head
for i in range(n):
runner = runner.next
if not runner:
head = head.next
return head
while runner.next:
runner = runner.next
slow = slow.next
slow.next = slow.next.next
return head