Python实现单向有序链表(Singly linked list)

概念介绍

上一博文已经介绍了Python实现单向无序链表的实现方式,这篇博文来介绍Python如何实现单向有序链表。有序和无序仅仅指节点所包含的数据成员的大小排列顺序,有序指各个节点按照节点数据成员的大小顺序排序,从大到小或从小到大。无序则可以任意排列。

链表节点实现

实现方式完全同单向无序列表,这里不再过多介绍,感兴趣的可以看Python实现单向无序链表(Singly linked list)关于节点的实现方式。

链表实现

链表的实现中,链表初始化,判断是否为空,获取链表长度与无序链表一致。同时,remove方式的实现也相同,都是遍历链表,找到指定节点,然后删除。主要的区别在于查找和添加(search和add方法)有所区别。

在无序链表中,查找是依次遍历各个节点,直至找到该节点,若节点不存在于链表中,也会一直遍历直到链表尾部。对于有序链表来说,由于各个节点的数据成员是有大小排序的,则查找算法可以有所优化。假如有这样一个有序链表,链表中各个节点的数据依次为17,26,31, 54,77,93。是按从小到大的顺序依次排序。如果我们想查找节点数据成员为45的节点是否在链表中,当我们找到31所在的节点时,其下一个节点数据类型为54,而45正好在31和54之间,却没有在链表中找到,则45所在的节点不存在,且不需要再继续遍历链表,因为随后的节点数据成员都比54要大。如下图所示。

下面来实现其算法,依然是遍历各个节点,若找到则返回True,若当前节点的数据成员值>item,则为找到,不需要继续遍历后续节点,因为后续节点的值比当前节点的值还要大。

若当前节点的值<item,则继续遍历。若链表为空或找到链表尾部依然没找到,则直接返回False。

    def search(self, item):
        current = self.head
        while current is not None:
            if current.get_data() == item:
                return True
            if current.get_data() > item:
                return False
            else:
                current = current.get_next()
        return False

接下来实现有序链表的add(添加新节点)方法。注意,在无序列表中,新添加的节点成为了链首节点,这种实现方式很简单。但在有序链表中,添加方法必须在插入链表后,依然要保持整个链表的有序状态(从大到小或从小到大)。假如有这样一个链表,节点的大小顺序为17,26,54, 77,93,我们想将31添加到链表中,显然应该添加到26和54中间的位置。

下面介绍实现原理:首先要插入节点,必然有一个当前节点和上一个节点,分别用current和previous指代。最后的目的是将指定节点插入到当前节点和上一个节点中间。

首先遍历节点,若当前节点的值大于指定节点的值,而显然后续的节点值比当前节点的值更大,则链表终止遍历。指定节点的值显然在当前节点和上一节点之间。若当前节点的值比指定节点的值小,则继续遍历,直至到最后一个节点。最后判断若上一个节点为空,则当前节点为空或当前节点的值比指定节点的值大,直接将当前节点设置为指定节点,插入到链首。若上一个节点不为空,直接将指定节点插入到二者之间(当前节点和上一个节点)。

    def add(self, item):
        current = self.head
        previous = None
        while current is not None:
            if current.get_data() > item:
                break
            previous = current
            current = current.get_next()
        temp = Node(item)
        if previous is None:
            temp.set_next(self.head)
            self.head = temp
        else:
            temp.set_next(current)
            previous.set_next(temp)

其他方法也可以按照类似的方式实现,其中pop方法同无序链表。

原文地址:https://www.cnblogs.com/jeffrey-yang/p/9840453.html

时间: 2024-11-05 22:03:10

Python实现单向有序链表(Singly linked list)的相关文章

待字闺中之快排(QuickSort)单向链表(Singly Linked List)

题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号"待字闺中" 分析:思路和数据的快速排序一样,都需要找到一个pivot元素.或者节点.然后将数组或者单向链表划分为两个部分,然后递归分别快排. 针对数组进行快排的时候,交换交换不同位置的数值,在分而治之完成之后,数据就是排序好的.那么单向链表是什么样的情况呢?除了交换节点值之外,是否有其他更好的方法呢?可以修改指针,不进行数值交换.这可以获取更高的效率. 在修改指针的过程中,会产生新的头指针以及尾指针,要记录下来.在par

将两个单向有序链表合并成一个单向有序链表

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 typedef struct student //声明结构体 5 { 6 int num; 7 struct student *pnext; 8 }stu,*pstu; 9 void link_sort_insert(pstu *,pstu *,int); //建立有序链表 10 void link_show(pstu ); 11 voi

Linked List {singly linked list -&gt; doubly linked list -&gt; circular linked list}

Linked List 单向链表 Singly linked list /********************************************************* Code writer : EOF Code file : single_linked_list.c Code date : 2015.01.15 e-mail : [email protected] Code description: Here is a implementation for singly

用Python写单向链表和双向链表

链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大. 链表由一个个节点组成. 单向链表的节点分为两个部分:存储的对象和对下一个节点的引用.注意是指向下一个节点. 而双向链表区别于单向链表的是它是由三个部分组成:存储的对象.对下一个节点的引用.对上一个节点的引用,可以实现双向遍历. 单向列表的结构如下图: head是头节点,tail是尾节点,每个节点由Data存储对象和Next对下一个节点引用组成 下面说一下单向链表插入和删除的过程. 插入一个新节点: 原理:前一个节点

单链表反转(Singly Linked Lists in Java)

单链表反转(Singly Linked Lists in Java) 博客分类: 数据结构及算法 Java代码   package dsa.linkedlist; public class Node<E>{ E data; Node<E> next; } Java代码   package dsa.linkedlist; public class ReverseLinkedListRecursively { public static void main(String args[])

leetcode python 012 hard 合并k个有序链表

#[LeetCode] Merge k Sorted Lists 合并k个有序链表(升序) import numpy as npimport time class Node(object):    def __init__(self,n,next_node=None):        self.data=n        self.next=next_node    class linklist(object):    def __init__(self):        self.head=N

算法之 有序链表和平衡二叉树

题目描述: Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 给定一个有序的链表,要求构建一颗平衡二叉查找树. 解析:二叉查找树的中序遍历的结构就是一颗二叉查找树,要使得最终的二叉查找树的结构尽可能的平衡,也就是说只需要将左右两边的节点数尽可能的均匀,(注意,此处的均匀是一个递归的概念,也就是说每一个节点的左右子树的节点个数都应

线性时间将两个有序链表合成一个有序链表(constant additional space)

description: given two sorted singly list, merge them into one using constant additional space algorithm: we will reference the two linked list as list1 and list2 for convenience, since list1 is sorted,just find the right position for each element in

[LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 这道题是要求把有序链表转为二叉搜索树,和之前那道Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树思路完全一样,只不过是操作的数据类型有所差别,一个是数组,一个是链表.数组方便就方便在可以通过index直接访问任意一个元