单链表

is_empty() 链表是否为空
length() 链表长度
travel() 遍历整个链表
add(item) 链表头部添加元素
append(item) 链表尾部添加元素
insert(pos, item) 指定位置添加元素
remove(item) 删除节点
search(item) 查找节点是否存在

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


class SingleList:
    def __init__(self):
        self.head=None

    def is_empty(self):
        return self.head==None

    def length(self):
        if self.is_empty():
            return 0
        cur=self.head
        count=0
        while cur!=None:
            count+=1
            cur=cur.next
        return count

    def travel(self):
        if self.is_empty():
            return
        cur=self.head
        while cur!=None:
            print(cur.item,end='\t')
            cur=cur.next

    def add(self,item):
        node = Node(item)
        if self.is_empty():
            self.head=node
            return
        else:
            node.next=self.head
            self.head=node

    def append(self,item):
        node = Node(item)
        if self.is_empty():
            self.head=node
            return
        else:
            cur=self.head
            while cur.next!=None:
                cur=cur.next
            cur.next=node


    def insert(self,pos,item):
        if pos<=0:
            self.add(item)
        elif pos>=(self.length()-1):
            self.append(item)
        else:
            count=0
            node = Node(item)
            cur=self.head
            while count<(pos-1):
                count+=1
                cur=cur.next
            node.next=cur.next
            cur.next=node

    def remove(self,item):
        if self.is_empty():
            return
        cur=self.head
        pre=None
        while cur!=None:
            if cur.item==item:
                if pre==None:
                    self.head=cur.next
                    # break
                else:
                    pre.next=cur.next
                break
            pre=cur
            cur=cur.next


    def search(self,item):
        if self.is_empty():
            return
        cur=self.head
        while cur!=None:
            if cur.item==item:
                return True
            cur=cur.next

        return False


single_list = SingleList()
for i in [3,2,1,4,5]:
    single_list.add(i)
single_list.travel()
print("")
for i in [13,12,11,14,15]:
    single_list.append(i)
single_list.travel()
print("")
single_list.insert(3,100)
single_list.travel()
print("")
single_list.remove(5)
single_list.travel()
print("")
print(single_list.search(100))

单链表有创建节点,初始化(将head置为空),求长度,遍历。
求长度和遍历本质上是差不多的。

再就是插入元素,分为头插,尾插,指定位置插入。
删除,按照元素进行删除

搜索

单链表中创建节点比较简单,然后是创建为None的链表也比较容易。接下来就是求长度,进行遍历了。在求长度和遍历的过程中指针一直都是后移,所以应该在循环中判断当前指针是否为末尾的状态,遍历除了循环条件的判断其他难度不高。

然后就是插入元素操作,插入元素分为多种情况,头插法比较容易,只是比较head指针和当前插入节点的。
尾插法需要遍历到文件的末尾。
在任意位置插入,如果是最开始就是头插法,最后的话就是尾插法,中间位置的情况需要比较。中间位置需要不断进行指针后移。

删除元素,用双指针。

搜索元素其实本质上和求长度和遍历都是一样的。

单链表的节点创建就是封装一个结构,这个结构中包含有数据和指向下一个节点的指针。

单链表的初始化就是创建一个一个空的链表,这个链表中不包含有元素。

单链表的判断空,其实就是判断是否包含节点。

单聊表的求长度,其实就是从头指针的位置从前向后就行遍历,怎么遍历是依靠节点的next域,从而找到下一个节点的。需要在一个循环中进行,每走一遍循环体,循环计数器不断加1操作。

单聊表的遍历和求长度是一样的,都是通过移动头指针,不断向后进行遍历,通过next域找到下一个节点,在循环体中访问当前节点,输出打印即可。

单链表的在头结点添加,通过移动head指针,即当前节点和head的指向是一样的,然后head指针指向新加入的节点。必须操作的是self.head指针。

单链表的尾部添加,从前向后遍历,一直循环到当前节点的next域为空。循环结束后,当前指针节点的next域指向新加入的节点。

单链表的任意位置添加,根据位置的不同,分为头和尾。头和尾如上所示,中间的任意位置,通过计数器从前向后访问,找到需要添加元素的位置。修改新加入节点的next为当前指针节点的next域,当前指针节点的next域指向新加入节点。

单链表的删除,利用经典的双指针法,技巧性是利用双指针,一个在前cur,一个在紧跟的后一个节点pre。具体情况分为被删除是否为头结点,如果是头结点,那么判断的条件是pre必定为空,将head指针的next指向当前节点的next域。
通过循环,在循环体中判断,如果不是头结点,那么修改pre的next域为当前节点cur的next域。

单链表的搜索,本质上和遍历是一样的。从 前到后进行遍历访问,如果能找到,返回为true。一直访问到结尾也没有找到,返回为false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值