如何在Python中创建与使用链表(单链表)

如何在Python中创建与使用链表(单链表)


最近用Python语言在Leetcode中刷题,接触到不少关于链表的题,学校目前还没有开设数据结构的课程(开设的话应该也是以C/C++语言写的)。

因为不太了解链表使用方式,开始跳过了这些题,不过后来还是自己研究了一下,大概是了解了,看到评论区也有人不知道链表的使用方式,就打算总结一下。

首先来看一下Leetcode官方定义的链表:

# Definition for singly-linked list.
class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

第一行说明了这是对单链表的定义。
其中链表元素只有两个属性,即valnext,前者代表当前原色的值,后者代表着这个元素指向的下一元素。next=None说明next的默认指向None

创建一个链表

可以使用如下方式:

head = None
for i in [4,3,2,1,0]:
    head = ListNode(i,head)

首先让表头(最终会是最后一个元素)指向None,然后利用for循环依次添加这个链结的前一个元素。因此,最终获得的链表会是这样的:

遍历一个链表

value = []
head2 = head
while head:
    value.append(head2.val)
    head2 = head2.next

这里使用一个列表来保存链表中元素的值。
在每次获取head的值之后,向前移一位。
由于是单链表,所以通过定义head2来保留链表的头部。
否则,while循环遍历后将无法访问链表的元素。

几道使用到链表的Leetcode题解

  • 两数之和 (简单)
    给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
class Solution(object):
    def addTwoNumbers(self, l1, l2):
        num1 = 0
        num2 = 0
        times = 0
        while l1 != None or l2 != None:
            if l1 != None:
                num1 += 10**times*l1.val
                l1 = l1.next
            if l2 != None:
                num2 += 10 ** times * l2.val
                l2 = l2.next
            times += 1
        num3 = num1 + num2
        temp = ListNode(0)
        head = temp
        for i in reversed(str(num3)):
            temp.next = ListNode(int(i))
            temp = temp.next
        return head.next
  • 删除链表的倒数第N个结点 (中等)
    给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。
class Solution(object):
    def removeNthFromEnd(self, head, n):
        length = 0
        t = head
        x = head
        while head:
            length += 1
            head = head.next
        current = 1
        while t:
            if current == length - n and n != 1 and n != length:
                t.next = t.next.next
            elif n == 1 and current == length - 1 :
                t.next = None
                return x
            elif n == length:
                return t.next
            t = t.next
            current += 1
        return x
  • 合并两个有序链表 (简单)
    将两个升序链表合并为一个新的升序链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。
class Solution(object):
    def mergeTwoLists(self, list1, list2):
        if not list1:
            return list2
        if not list2:
            return list1
        result = None
        while list1 or list2:
            if not (list1 and list2):
                while list1:
                    result = ListNode(list1.val,result)
                    list1 = list1.next
                while list2:
                    result = ListNode(list2.val,result)
                    list2 = list2.next
            else:
                if list1.val < list2.val:
                    result = ListNode(list1.val,result)
                    list1 = list1.next
                else:
                    result = ListNode(list2.val, result)
                    list2 = list2.next
        result2 = None
        while result:
            result2 = ListNode(result.val,result2)
            result = result.next
        return result2
  • 两两交换链表中的节点 (中等)
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。 你必须在不修改节点内部的值的情况下完成本题 (即,只能进行节点交换)。
class Solution(object):
    def swapPairs(self, head):
        if not head:
            return head
        if not head.next:
            return head
        copyhead = head.next
        while head and head.next:
            second = head.next
            if head.next.next:
                third = head.next.next
                if head.next.next.next:

                    head.next = head.next.next.next
                else:
                    head.next = head.next.next
            else:
                head.next = None
                third = None
            second.next = head
            head = third
        return copyhead
  • 删除排序链表中的重复元素(简单)
    给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表 。
class Solution(object):
    def deleteDuplicates(self, head):
        node = head
        if not head:
            return head
        while head.next:
            if not head.next == None:
                if head.val == head.next.val:
                    head.next = head.next.next
                else:
                    head = head.next
        return node

题目来源:力扣
查看原题:力扣题库

 

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Python创建一个链表,可以使用节点类和链表类的组合。首先,我们需要定义一个节点类,该类包含一个值和一个指向下一个节点的指针。然后,我们可以使用节点类来定义链表类,该类包含一个头节点,并提供一些方法来操作链表。 以下是一个示例代码来创建一个链表: ``` # 定义节点类 class Node(object): def __init__(self, val=None, next=None): self.val = val self.next = next # 定义链表类 class LinkedList(object): def __init__(self): self.head = None # 在链表头部插入节点 def insert_at_head(self, val): new_node = Node(val) new_node.next = self.head self.head = new_node # 在链表尾部插入节点 def insert_at_tail(self, val): new_node = Node(val) if not self.head: self.head = new_node else: current = self.head while current.next: current = current.next current.next = new_node # 打印链表 def print_list(self): current = self.head while current: print(current.val, end=" ") current = current.next print() # 创建链表实例 linkedList = LinkedList() # 插入节点 linkedList.insert_at_head(3) linkedList.insert_at_head(2) linkedList.insert_at_head(1) linkedList.insert_at_tail(4) linkedList.insert_at_tail(5) # 打印链表 linkedList.print_list() ``` 这段代码创建了一个链表实例`linkedList`,并在头部插入了节点1、2、3,在尾部插入了节点4、5,并打印了链表的值。你可以根据自己的需求修改节点的值和插入位置。 #### 引用[.reference_title] - *1* [python链表的建立](https://blog.csdn.net/Ice1774/article/details/128028633)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [如何在Python创建使用链表单链表)](https://blog.csdn.net/jingzhiyang/article/details/128761768)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Python学习系列——构建链表](https://blog.csdn.net/jh_210/article/details/115248918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值