链表

时间:2020-05-09
本文章向大家介绍链表,主要包括链表使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

定义

定义节点:数据域、指针域

class Node(object):

	def __init__(self, data, next=None):

		self.data = data

		self.next = next

head指针指向的是第一个节点。

定义链表,及操作:

# 定义单链表:头指针、尾指针、链表长度
class linkOne(object):
    def __init__(self):
        # 头指针
        self.head = None
        # 尾指针
        self.tail = None
        # 元素个数,即链表长度
        self.count = 0

    def isEmpty(self):
        # return self.count == 0
        if self.count == 0:
            return True
        else:
            return False

    def size(self):
        return self.count

    # 添加节点到尾部:尾插法
    def addElementToTail(self, data):
        # 若尾指针不为空
        if (self.tail != None):
            # 新建一个节点并存入数据
            temp = Node(data, None)
            # 添加节点
            self.tail.next = temp
            # 尾指针后移
            self.tail = temp
            # 链表长度加1
            self.count += 1
        # 尾指针为空
        else:
            self.head = self.tail = Node(data, None)
            self.count += 1

    # 删除节点
    def DeleteElementFromTail(self):
        # 链表为空:头、尾指针都指向首节点
        if (self.head == self.tail):
            self.count = 0
            self.head = self.tail = None
        # 链表不为空
        else:
            temp = self.tail
            t = self.head
            while (t.next != self.tail):
                t = t.next
            self.tail = t
            self.count -= 1
            # del temp
        return temp.data


lk = linkOne()
lk.addElementToTail(10)
lk.addElementToTail(20)
lk.addElementToTail(30)
lk.addElementToTail(40)
print(lk.size())
print(lk.tail.data)
print(lk.head.data, lk.head.next.data, lk.head.next.next.data)
print(lk.DeleteElementFromTail(), lk.tail.data)

Py和C实现链表的区别

python是动态语言,可以直接把对象赋值给新的变量。

在C/C++中,通常采用“指针+结构体”来实现链表;

而在Python中,则可以采用“引用+类”来实现链表。

如下图:

mylist = Node()

mylist.next = head

head指针指向的是第一个节点。

单链表头插法、尾插法

设node是待插入节点。

头插法:

node.next = head.next
head.next = node

尾插法:

while head.next:
	head = head.next
head.next = node

头插法反转链表:

#新链表的头指针
pre = None
while head:
	#暂存头指针指向节点的下一个节点
	temp = head.next
	#断开原链表,头插法接到新链表
	head.next = pre
	pre = head
	head = temp
return pre

在指定位置(第index个位置)插入节点:

i = 0
cur_node = self.head.next
while i != index:
	cur_node = cur_node.next
	i += 1
node.next = cur_node.next
cur_node.next = node

原文地址:https://www.cnblogs.com/panweiwei/p/12856707.html