数据结构与算法之单向链表_python3

链表是一种常见的线性存储结构,它的每个节点(存储单元)分为值和指针两部分,指针指向下一个节点,若无下一个节点则指针为空。因此只需知晓其头节点(head),就可以推算出整个链表。
相较于顺序存储结构,链表定点增删数据时较快。因为它们在遍历找到对应位置后,链表只需增删单个节点并更新前后节点(注意首尾节点)的指针,而顺序存储结构需要通过拷贝粘贴把后面的子列表往后挪一格,较为耗时。

# coding:utf-8
from collections import Iterable


class Node:  # 单向链表节点
    def __init__(self, val):
        self.val = val
        self.next = None


class LinkedList:  # 单向链表
    def __init__(self):
        self.head = None

    def initialize(self, iterator):
        assert isinstance(iterator, Iterable)
        if len(iterator) == 0:
            return
        self.head = Node(iterator[0])
        if len(iterator) == 1:
            return
        cur = self.head
        for val in iterator[1:]:
            next = Node(val)
            cur.next = next
            cur = next

    def reverse(self):  # 反转
        cur = self.head
        pre = None
        while cur.next:
            next = cur.next  # 取出下一个节点next
            cur.next = pre  # 将当前节点的指针指向上一个节点

            pre = cur  # 为下次循环赋值
            cur = next
        else:  # 注意,当跳出循环时,最后元素的指针未指向倒数第二个元素
            self.head = cur
            self.head.next = pre


if __name__ == "__main__":
    l = LinkedList()
    l.initialize([1, 34, 31, 2])
    print(l.head.next.next.val)
    l.reverse()
    print(l.head.next.next.val)

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