面试中被问链表的题目我就不再多说,直接总结题目。
1、将链表逆序
这个问题很早就研究过,但后来一次面试的时候我突然紧张忘了,没答上来。
我不知道大家的解法是什么,我的解法是遍历链表是用前插发插入节点,最后的链表就是逆序的。
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def resverse(self, head):
print id(head)
if None == head or None == head.next:
return head
p = head.next
head.next = None
while None != p:
q = p.next
p.next = head
head = p
p = q
return head
2、判断链表中是否有环
这个问题似乎是有固定的解法即就是设置快、慢两个指针,若指针能相遇,则说明有环,如果慢指针为 None了,就说明没有环
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def hasCycle(self, head):
if None == head or None == head.next:
return False
p = head
q = head.next
while q != None and p != q:
p = p.next
q = q.next
if None != q:
q = q.next
return p == q
3、既然链表中有环,求取环的长度
仔细想想,这其实和我们小学的追击问题是一样的,甲乙相遇的条件是 S甲 - S2 = n * 周长。另外,因为已经找到了环上的一个点,那么直接从该点开始,下次到该点时所走长度就是环的长度。
class Solution:
def cycleLen(self, head):
if None == head or None == head.next:
return 0
p = head
q = head.next
while q != None and p != q:
p = p.next
q = q.next
if None != q:
q = q.next
if p != q:
return 0
ret_len = 1
p = p.next
while p != q:
ret_len += 1
p = p.next
return ret_len