Cho danh sách liên kết đơn, tìm giá trị nút giữa. Nếu có 2 nút giữa, trả về nút thứ hai. Yêu cầu một lần duyệt.
Ví dụ
Đầu vào: [5,9,6,4,8,2,1,4,5,2].
Đầu ra: 2.
Thuật toán
- Sử dụng hai con trỏ:
p(slow) vànode(fast). nodenhảy 2 bước,pnhảy 1 bước mỗi khinodenhảy 2 bước.- Khi
nodehết,pở giữa (hoặc nút thứ hai nếu chẵn).
Mã nguồn Python
class ListNode:
def __init__(self, data, next=None):
self.val = data
self.next = next
def make_list(elements):
head = ListNode(elements[0])
for element in elements[1:]:
ptr = head
while ptr.next:
ptr = ptr.next
ptr.next = ListNode(element)
return head
class Solution:
def solve(self, node):
p = node
d = 0
l = 0
while node:
if d != 2:
node = node.next
l += 1
d += 1
else:
p = p.next
d = 0
return p.val if l & 1 else p.next.val
ob = Solution()
head = make_list([5,9,6,4,8,2,1,4,5,2])
print(ob.solve(head))
Đầu vào / Đầu ra
Input: [5,9,6,4,8,2,1,4,5,2]
Output: 2