无涯教程-Python - 链表(Linked)

98 阅读3分钟

链表(Linked List)是一系列数据元素,它们通过链接连接在一起,每个数据元素都包含指向指针形式的另一个数据元素的连接。

创建链表

无涯教程创建一个Node对象,通过节点对象传递值,以将指向下一个元素,下面的程序使用三个元素创建链接列表。

class Node:
    def __init__(self, dataval=None):
        self.dataval=dataval
        self.nextval=None

class SLinkedList: def init(self): self.headval=None

list1=SLinkedList() list1.headval=Node("Mon") e2=Node("Tue") e3=Node("Wed") # 将第一个节点链接到第二个节点 list1.headval.nextval=e2

# 将第二个节点链接到第三个节点 e2.nextval=e3

遍历链表

单链表只能从第一个数据元素开始沿向前的方向遍历,无涯教程只需将下一个节点的指针指向当前数据元素,就可以打印下一个数据元素的值。

class Node:
    def __init__(self, dataval=None):
        self.dataval=dataval
        self.nextval=None

class SLinkedList: def init(self): self.headval=None

</span><span class="kwd">def</span><span class="pln"> listprint</span><span class="pun">(</span><span class="kwd">self</span><span class="pun">):</span><span class="pln">
    printval</span><span class="pun">=</span><span class="kwd">self</span><span class="pun">.</span><span class="pln">headval
    </span><span class="kwd">while</span><span class="pln"> printval </span><span class="kwd">is</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> </span><span class="kwd">None</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="pln">printval</span><span class="pun">.</span><span class="pln">dataval</span><span class="pun">)</span><span class="pln">
        printval</span><span class="pun">=</span><span class="pln">printval</span><span class="pun">.</span><span class="pln">nextval

list=SLinkedList() list.headval=Node("Mon") e2=Node("Tue") e3=Node("Wed")

# 将第一个节点链接到第二个节点 list.headval.nextval=e2

# 将第二个节点链接到第三个节点 e2.nextval=e3

list.listprint()

执行以上代码后,将产生以下输出:

Mon
Tue
Wed

插入链表

在链表中插入元素涉及将指针从现有节点重新分配给新插入的节点,取决于是否在以下位置插入新数据元素 在链表的开头,中间或结尾,有以下情形。

链表开头插入

将新数据节点的下一个指针指向链接列表的头节点。

class Node:
    def __init__(self, dataval=None):
        self.dataval=dataval
        self.nextval=None

class SLinkedList: def init(self): self.headval=None

# 打印链表 def listprint(self): printval=self.headval while printval is not None: print (printval.dataval) printval=printval.nextval def AtBegining(self,newdata): NewNode=Node(newdata)

# 将新节点 next val 更新为现有节点 NewNode.nextval=self.headval self.headval=NewNode

list=SLinkedList() list.headval=Node("Mon") e2=Node("Tue") e3=Node("Wed")

list.headval.nextval=e2 e2.nextval=e3

list.AtBegining("Sun")

list.listprint()

执行以上代码后,将产生以下输出:

Sun
Mon
Tue
Wed

链表末尾插入

将新数据节点链接插入到最后一个节点的下一个指针指向的节点。

class Node:
    def __init__(self, dataval=None):
        self.dataval=dataval
        self.nextval=None

class SLinkedList: def init(self): self.headval=None

#添加新节点的函数 def AtEnd(self, newdata): NewNode=Node(newdata) if self.headval is None: self.headval=NewNode return laste=self.headval while(laste.nextval): laste=laste.nextval laste.nextval=NewNode

# 打印链表 def listprint(self): printval=self.headval while printval is not None: print (printval.dataval) printval=printval.nextval

list=SLinkedList() list.headval=Node("Mon") e2=Node("Tue") e3=Node("Wed")

list.headval.nextval=e2 e2.nextval=e3

list.AtEnd("Thu")

list.listprint()

执行以上代码后,将产生以下输出:

Mon
Tue
Wed
Thu

节点之间插入

将新节点的下一个指针更改为中间节点的下一个指针,然后将新节点分配给中间节点的下一个指针。

class Node:
    def __init__(self, dataval=None):
        self.dataval=dataval
        self.nextval=None

class SLinkedList: def init(self): self.headval=None

# 添加节点的函数 def Inbetween(self,middle_node,newdata): if middle_node is None: print("The mentioned node is absent") return

    </span><span class="typ">NewNode</span><span class="pun">=</span><span class="typ">Node</span><span class="pun">(</span><span class="pln">newdata</span><span class="pun">)</span><span class="pln">
    </span><span class="typ">NewNode</span><span class="pun">.</span><span class="pln">nextval</span><span class="pun">=</span><span class="pln">middle_node</span><span class="pun">.</span><span class="pln">nextval
    middle_node</span><span class="pun">.</span><span class="pln">nextval</span><span class="pun">=</span><span class="typ">NewNode</span><span class="pln">

# 打印链表 def listprint(self): printval=self.headval while printval is not None: print (printval.dataval) printval=printval.nextval

list=SLinkedList() list.headval=Node("Mon") e2=Node("Tue") e3=Node("Thu")

list.headval.nextval=e2 e2.nextval=e3

list.Inbetween(list.headval.nextval,"Fri")

list.listprint()

执行以上代码后,将产生以下输出:

Mon
Tue
Fri
Thu

链表删除节点

找到要删除的节点的上一个节点, 然后,将该节点的下一个指针指向要删除的节点的下一个节点。

class Node:
    def __init__(self, data=None):
        self.data=data
        self.next=None

class SLinkedList: def init(self): self.head=None

</span><span class="kwd">def</span><span class="pln"> </span><span class="typ">Atbegining</span><span class="pun">(</span><span class="kwd">self</span><span class="pun">,</span><span class="pln"> data_in</span><span class="pun">):</span><span class="pln">
    </span><span class="typ">NewNode</span><span class="pun">=</span><span class="typ">Node</span><span class="pun">(</span><span class="pln">data_in</span><span class="pun">)</span><span class="pln">
    </span><span class="typ">NewNode</span><span class="pun">.</span><span class="kwd">next</span><span class="pun">=</span><span class="kwd">self</span><span class="pun">.</span><span class="pln">head
    </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">head</span><span class="pun">=</span><span class="typ">NewNode</span><span class="pln">
	

#删除节点的函数 def RemoveNode(self, Removekey):

    </span><span class="typ">HeadVal</span><span class="pun">=</span><span class="kwd">self</span><span class="pun">.</span><span class="pln">head

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">HeadVal</span><span class="pln"> </span><span class="kwd">is</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> </span><span class="kwd">None</span><span class="pun">):</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">HeadVal</span><span class="pun">.</span><span class="pln">data </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Removekey</span><span class="pun">):</span><span class="pln">
            </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">head</span><span class="pun">=</span><span class="typ">HeadVal</span><span class="pun">.</span><span class="kwd">next</span><span class="pln">
            </span><span class="typ">HeadVal</span><span class="pun">=</span><span class="kwd">None</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln">

    </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="typ">HeadVal</span><span class="pln"> </span><span class="kwd">is</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> </span><span class="kwd">None</span><span class="pun">):</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="typ">HeadVal</span><span class="pun">.</span><span class="pln">data </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Removekey</span><span class="pun">:</span><span class="pln">
            </span><span class="kwd">break</span><span class="pln">
        prev</span><span class="pun">=</span><span class="typ">HeadVal</span><span class="pln">
        </span><span class="typ">HeadVal</span><span class="pun">=</span><span class="typ">HeadVal</span><span class="pun">.</span><span class="kwd">next</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">HeadVal</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">None</span><span class="pun">):</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln">

    prev</span><span class="pun">.</span><span class="kwd">next</span><span class="pun">=</span><span class="typ">HeadVal</span><span class="pun">.</span><span class="kwd">next</span><span class="pln">

    </span><span class="typ">HeadVal</span><span class="pun">=</span><span class="kwd">None</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> </span><span class="typ">LListprint</span><span class="pun">(</span><span class="kwd">self</span><span class="pun">):</span><span class="pln">
    printval</span><span class="pun">=</span><span class="kwd">self</span><span class="pun">.</span><span class="pln">head
    </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">printval</span><span class="pun">):</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">printval</span><span class="pun">.</span><span class="pln">data</span><span class="pun">),</span><span class="pln">
        printval</span><span class="pun">=</span><span class="pln">printval</span><span class="pun">.</span><span class="kwd">next</span><span class="pln">

llist=SLinkedList() llist.Atbegining("Mon") llist.Atbegining("Tue") llist.Atbegining("Wed") llist.Atbegining("Thu") llist.RemoveNode("Tue") llist.LListprint()

执行以上代码后,将产生以下输出:

Thu
Wed
Mon

参考链接

www.learnfk.com/python-data…