数据结构与算法(python)——单向链表

链表由节点和有向链构成。因此我们可以生成两个类:节点类和单向链表操作类。

节点类:

节点类用于构建单链表的节点,一个节点包含两个部分:值和指向。(假设节点类不具有指向性,因此next的参数默认为None)

class Node:
    def __init__(self, val, next=None):
        self.val = val    #将val传入的值赋给self.val
        self.next = next  #next始终为None,不具备指向性,在实例化时进行指向

下面进行实例化举例:

创建node1(val=1),node2(val=2),并将node1指向node2。

node1 = Node(1)     # ①
node2 = Node(2)     # ②
node1.next = node2  # ③

 单向链表类:

在创建单链表类,我们要首先创建一个头节点,这个头节点仅代表一个链表的开始,故不需要赋值。

1、创建头节点:

class LinkList:
    def __init__(self):
        self.head = Node(None)  # 通过之前的Node类创建一个链表的头结点

下面进行实例化举例:

创建一个包含头结点和一个节点的单链表。

思路:首先生成一个头节点,一个节点,再将头节点指向节点。

l = LinkList()  # 用l将linklist实例化,之后l就具有了linklist所具有的属性
node = Node(1)  # 生成节点
l.head.next = node  # l.head就是生成的头节点:Node(none),图中用node_head表示
                    # .next表示将头节点指向node

由上图,如何通过头结点找到node?  ——l.head.next     如何访问node的值?——l.head.next.val

 2、将列表转换为链表:

思路:通过访问列表,对每一个列表里的值循环进行添加节点即可。我们引入临时变量p代表当前到达的节点。一开始p在头节点处,为头结点添加node1,之后p移动到node1,为node1添加node2,之后p移动到node2,为node2添加node3.........直到将列表的元素全部添加完。

# 将列表转换为链表
def init_list(self, list_):
    p = self.head            # 将头节点赋给p 
    for item in list_:       # 循环遍历列表
        p.next = Node(item)  # 将下一个节点添加在当前节点(p)之后
        p = p.next           # 将p移动到下一个节点

3、遍历链表并返回值

# 遍历列表并返回值
def show(self):
    p = self.head.next
    while p is not None:
        print(p.val)
        p = p.next

4、清除全部链表

思路:直接将头节点的next置为None即可。python会将剩下的数据自己清理掉。

# 清空全部链表
def clear(self):
    self.head.next = None

 5、检查是否为空

# 检查链表是否为空
def is_empty(self):
    if self.head.next is None:
        return True
    else:
        return False

6、插入

①尾插法:

思路:将p遍历到最后一个节点,在最后一个节点之后添加一个node

# 在链表末尾插入一个节点
def append(self, val):
    p = self.head
    while p.next is not None:
        p = p.next
    p.next = Node(val)

②头插法:

思路:将要插入的节点的next指向头节点的下一个节点,将头节点的next指向该节点。

def head_insert(self, val):
    node = Node(val)           # ①
    node.next = self.head.next # ②
    self.head.next = node      # ③

③随意插入法:

思路:引入临时变量p表示当前节点位置。将p移动到index-1的位置,采用和头插法相同的思路插入。

# 在index处插入节点
def insert(self, index, val):
    p = self.head
    for i in range(index):
        if p.next is None:
            break
        p = p.next
    node = Node(val)
    node.next = p.next
    p.next = node

7、传入节点位置并获取相应值

def get_index(self, index):
    p = self.head.next
    for i in range(index):
        if p.next is None:
            raise IndexError("list index is out of range")
        p = p.next
    return p.val

8、删除节点操作(按值删除)

def delete(self, x):
    p = self.head
    while p.next and p.next.val != x:
        p = p.next
    if p.next is None:
        raise ValueError("x is not found")
    else:
        p.next = p.next.next
    

猜你喜欢

转载自blog.csdn.net/weixin_45958695/article/details/128174502