2022.02.27

课时22

使用链表的过程

两个类的产生,节点类和链表类。

遍历链表。需要一个游标来帮助记录当前位置。

游标找到第一个节点,然后通过第一个节点的指向next,找到下一个节点。

因为遍历链表的第一步,需要一个游标。

那么如何使游标的移动停止呢?如何设置循环条件?

 

 不管条件如何,首先要使计数等于0,然后每移动一个节点,加1.

 而要使游标往后移,则需要在循环里面使它每次指向下面一个值。

 

    deflengthl(self):
        """遍历整个链表"""
        """cur游标,用来移动遍历节点"""
        cur=self._head
        """count记录数量"""
        count = 0
        while cur !=None:
            count+=1
            cur=cur.next
        return count

而在空链表时,返回值应该为0.


    def travel(self):
        """遍历整个链表"""
        cur=self._head
        while cur != None:
            print(cur.elem)#一进入循环,就打印游标当前的东西.
            cur=cur.next

class Node(object):
    """节点"""
    def __init__(self,elem): #把结点保存在构造函数里."elem"是用来接受节点的。
        self.elem=elem #elem保存数据
        self.next=None #指向什么,一开始并不知道,所以设置为None

class SingleLinkList(object): #定义一个单链表的类
    #单链表要把节点串联起来.
    def __init__(self,node=None):
        self.head=node #保存头节点信息。若果先构建了一个节点,可把节点传入作为头节点。

    def is_empty(self):
        """链表是否为空"""
        return self.head==None
    def length(self):
        """链表长度"""
        """cur游标,用来移动遍历节点"""
        cur=self.head
        """count记录数量"""
        count = 0
        while cur !=None:
            count+=1
            cur=cur.next
        return count

    def travel(self):
        """遍历整个链表"""
        cur=self.head
        while cur != None:
            print(cur.elem)#一进入循环,就打印游标当前的东西.
            cur=cur.next

    def append(self,item):
        """尾部插入节点"""
        """应该让游标一直走,走到尾部,才能进行添加"""
        """但是实际使用时,应该让用户不用关心游标,直接传入一个节点,便能在该节点出添加"""
        node=Node(item)

        if self.is_empty():
            self.head=node
        else:
            cur=self.head
            while cur.next!=None:
                cur=cur.next
            cur.next=node

if __name__=="__main__":
    ll=SingleLinkList()
    print(ll.is_empty())
    print(ll.length())

    ll.append(1)
    print(ll.is_empty())
    print(ll.length())

    ll.append(2)
    ll.append(3)
    ll.append(4)
    ll.append(5)
    ll.travel()

执行结果:
True
0
False
1
1
2
3
4
5

 课时23

链表头部添加元素。

即在head与第一个节点之间插入。而新节点应该是指向none的。

为了让原有的链表结构不丢掉。 

第一步应该是新节点指向原有的链表的第一个节点。

而第二步应该是让head指向新节点。

 第一步。

 

def add(self,item):
    """链表头部添加元素"""
    node=Node(item) #将item封装为一个节点
    node.next=self.__head#双下划线表属性私有
    self.__head=node #可以处理原有链表是空链表的情况。
class Node(object):
    """节点"""
    def __init__(self,elem): #把结点保存在构造函数里."elem"是用来接受节点的。
        self.elem=elem #elem保存数据
        self.next=None #指向什么,一开始并不知道,所以设置为None

class SingleLinkList(object): #定义一个单链表的类
    #单链表要把节点串联起来.
    def __init__(self,node=None):
        self.__head=node #保存头节点信息。若果先构建了一个节点,可把节点传入作为头节点。

    def is_empty(self):
        """链表是否为空"""
        return self.__head==None
    def length(self):
        """链表长度"""
        """cur游标,用来移动遍历节点"""
        cur=self.__head
        """count记录数量"""
        count = 0
        while cur !=None:
            count+=1
            cur=cur.next
        return count

    def travel(self):
        """遍历整个链表"""
        cur=self.__head
        while cur != None:
            print(cur.elem,end="")#一进入循环,就打印游标当前的东西.
            cur=cur.next

    def append(self,item):
        """尾部插入节点"""
        """应该让游标一直走,走到尾部,才能进行添加"""
        """但是实际使用时,应该让用户不用关心游标,直接传入一个节点,便能在该节点出添加"""
        node=Node(item)

        if self.is_empty():
            self.__head=node
        else:
            cur=self.__head
            while cur.next!=None:
                cur=cur.next
            cur.next=node

    def add(self, item):
        """链表头部添加元素"""
        node = Node(item)  # 将item封装为一个节点
        node.next = self.__head  # 双下划线表属性私有
        self.__head = node  # 可以处理原有链表是空链表的情况。

if __name__=="__main__":
    ll=SingleLinkList()
    print(ll.is_empty())
    print(ll.length())

    ll.append(1)
    print(ll.is_empty())
    print(ll.length())

    ll.append(2)
    ll.add(8)
    ll.append(3)
    ll.append(4)
    ll.append(5)
    ll.travel()

执行结果:
True
0
False
1
812345
#在头部插入了8

那么如何在任意的指定位置添加元素呢?

比如,插在第2个位置,则应该是偏移量为2的地方。

 应该先找到下标所找到的位置。从头开始找。

要移动到指定位置的前一个位置,该位置可称为”pre“或”prior“。

 接着改变新节点的next区域,使它指向300.

 要使,pre所指的节点中的next区域指向新节点。

pre=self.__head,是指找到head所指向的节点,将该节点的位置赋值给pre,使pre指向该节点。

def insert(self,pos,item): #pos为指定的位置
    """指定位置添加元素"""
    """:param pos 从0开始"""
    if pos<=0:
        self.add(item)#pos小于或等于零,那么就是在头部插入元素,即用头插法。
    elif pos>self.lengh()-1:
        self.append(item) #如果pos大于链表最后的下标,那么就是在尾部添加。
    else:
        pre=self.__head
        count=0
        while count<(pos-1):
            count+=1
            pre=pre.next
        #当退出循环后,pre指向pos-1位置
        node=Node(item)
        node.next=pre.next
        pre.next=node

 

class Node(object):
    """节点"""
    def __init__(self,elem): #把结点保存在构造函数里."elem"是用来接受节点的。
        self.elem=elem #elem保存数据
        self.next=None #指向什么,一开始并不知道,所以设置为None

class SingleLinkList(object): #定义一个单链表的类
    #单链表要把节点串联起来.
    def __init__(self,node=None):
        self.__head=node #保存头节点信息。若果先构建了一个节点,可把节点传入作为头节点。

    def is_empty(self):
        """链表是否为空"""
        return self.__head==None
    def length(self):
        """链表长度"""
        """cur游标,用来移动遍历节点"""
        cur=self.__head
        """count记录数量"""
        count = 0
        while cur !=None:
            count+=1
            cur=cur.next
        return count

    def travel(self):
        """遍历整个链表"""
        cur=self.__head
        while cur != None:
            print(cur.elem,end="")#一进入循环,就打印游标当前的东西.
            cur=cur.next
        print("")

    def append(self,item):
        """尾部插入节点"""
        """应该让游标一直走,走到尾部,才能进行添加"""
        """但是实际使用时,应该让用户不用关心游标,直接传入一个节点,便能在该节点出添加"""
        node=Node(item)

        if self.is_empty():
            self.__head=node
        else:
            cur=self.__head
            while cur.next!=None:
                cur=cur.next
            cur.next=node

    def add(self, item):
        """链表头部添加元素"""
        node = Node(item)  # 将item封装为一个节点
        node.next = self.__head  # 双下划线表属性私有
        self.__head = node  # 可以处理原有链表是空链表的情况。

    def insert(self, pos, item):  # pos为指定的位置
        """指定位置添加元素"""
        """:param pos 从0开始"""
        if pos <= 0:
            self.add(item)  # pos小于或等于零,那么就是在头部插入元素,即用头插法。
        elif pos > self.length() - 1:
            self.append(item)  # 如果pos大于链表最后的下标,那么就是在尾部添加。
        else:
            pre = self.__head
            count = 0
            while count < (pos - 1):
                count += 1
                pre = pre.next
            # 当退出循环后,pre指向pos-1位置
            node = Node(item)
            node.next = pre.next
            pre.next = node

if __name__=="__main__":
    ll=SingleLinkList()
    print(ll.is_empty())
    print(ll.length())

    ll.append(1)
    print(ll.is_empty())
    print(ll.length())

    ll.append(2)
    ll.add(8)
    ll.append(3)
    ll.append(4)
    ll.append(5)
    #812345
    ll.insert(-1,9) #9812345
    ll.insert(3,100)#9 8 1 100 2345
    ll.insert(7,200)#9 8 1 100 234 200 5
    ll.travel()

执行结果:
True
0
False
1
9811002342005

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值