- 环形链表 II
思路1:先把数据遍历循环到列表里边,然后在里边查找,如果能找到则输出
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
a =[]
while head:
if head in a:
return head
else:
a.append(head)
head = head.next
return None
思路2:无环的直接返回None,有环的情况:快节点以2v的速度走,慢节点以v的速度走,二者终会在某节点相遇。快节点比慢节点多走的环形部分长v(相遇点到相遇点),v也是head到相遇点长度,环入口到相遇点是公共部分,减去后相遇点到环入处距离等于head到环入口,所以根据相遇点距环入口的距离等于头节点距环入口的距离。
所以相遇之后就让快节点重新从head开始,它们再次相遇的地方就是入口。
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
slow = fast = head
while fast and fast.next:
a =[]
a.append(slow)
fast = fast.next.next
slow = slow.next
if slow is fast:
fast = head
while fast is not slow:
fast = fast.next
slow = slow.next
return fast
return None
206. 反转链表
迭代
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
prev = cur = None
if head:
prev = head
cur = head.next
prev.next = None
else:
return None
while cur:
tmp = cur
cur = cur.next
tmp.next = prev
prev = tmp
return prev
链表:
链表是动态分配存储空间的链式存储结构。
其包括一个“头指针”变量,其中第0个结点称为整个链表的头结点,头结点中存放一个地址,该地址指向一个元素,头结点一般不存放具体数据,只是存放第一个结点的地址。
链表中每一个元素称为“结点”,每个结点都由两部分组成:存放数据元素的数据域和存储直接后继存储位置的指针域。指针域中存储的即是链表的下一个结点存储位置,是一个指针。多个结点链接成一个链表。
最后一个结点的指针域设置为空(NULL),作为链表的结束标志,表示它没有后继结点。