链表练习题

链表的基本练习题对应的LeetCode题号以及基本解法

206链表反转

一个指针用于遍历链表,一个指针用于记录反转后的链表

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

141判断是否有环

使用快慢指针,慢指针步长为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

21合并两个排好序的链表

较为基础的解法

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

876寻找链表中点

利用快慢指针,慢指针步长为1快指针步长为2,当快指针到达尾结点时慢结点恰好到中点。

def middleNode(self, head):
    fast = head
    while fast and fast.next:
        head = head.next
        fast = fast.next.next
    return head

19remove倒数第n个结点

先使用一个指针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

你可能感兴趣的:(Python,数据结构与算法)