【数据结构】链表

class ListNode:
    def __init__(self, val):
        self.val = val
        self.next = None


############### 链表反转 ############################################
def main():
    nums = [1, 2, 4, 6, 7]
    head = tmp = ListNode(nums[0])
    for i in nums[1:]:
        tmp.next = ListNode(i)
        tmp = tmp.next
    print(head)
    res = reverse_list(head)
    while res:
        print(res.val)
        res = res.next


def reverse_list(head: ListNode):
    pre = None
    cur = head
    while cur:
        next_node = cur.next
        cur.next = pre
        cur, pre = next_node, cur

    return pre


def reverse_list1(head):
    stack = []
    while head:
        stack.append(head)
        head = head.next

    if len(stack) == 0:
        return None
    res = tmp = stack.pop()
    while len(stack) != 0:
        tmp.next = stack.pop()
        tmp = tmp.next
    tmp.next = None
    return res


##################### 合并俩个排序链表 ############################################

def merge(l1: ListNode, l2: ListNode):
    result = tmp = ListNode(-1)
    while l1 and l2:
        if l1.val <= l2.val:
            tmp.next = l1
            l1 = l1.next
        else:
            tmp.next = l2
            l2 = l2.next
        tmp = tmp.next
    tmp.next = l1 if l1 else l2
    return result.next


def merge1(l1: ListNode, l2: ListNode):
    if not l1 or not l2:
        return l1 if l1 else l2
    if l1.val <= l2.val:
        l1.next = merge1(l1.next, l2)
        return l1
    else:
        l2.next = merge1(l2.next, l1)
        return l2


##############  删除链表节点 ##########################

def delete_node(head: ListNode, val):
    res = tmp = ListNode(-1)
    while head:
        if head.val == val:
            continue
        else:
            tmp.next = head
        head = head.next
    return res.next


######################### 删除链表中重复的结点 ###########################

def delete_duplication(head: ListNode):
    res = pre = ListNode(-1)
    tmp = head
    node_map = dict()
    while head:
        if head.val not in node_map:
            node_map[head.val] = 1
        else:
            node_map[head.val] += 1
        head = head.next

    while tmp:
        if node_map[tmp.val] != 1:
            continue
        else:
            pre.next = tmp
        tmp = tmp.next
    return res



if __name__ == '__main__':
    main()

posted @ 2022-07-12 10:52  倒骑驴子  阅读(14)  评论(0编辑  收藏  举报