Python数据结构与算法:第3-6课时:单链表头部添加和在指定位置添加



在单链表尾部插入元素,尾插法

头部添加叫,头插法。



头部添加元素 add:

实现原理:

python word 制定位置添加文字 python 列表指定位置添加_python


让列表头节点指向新加入元素400的地址, 400节点存放的next节点指向 100的地址。


注意:

但是有个先后顺序的问题,如果你先把400的地址(100的地址)赋给了 表头节点指向地址,那么100的地址你就会缺失了。后面的数据就都找不到了,

所以,应该先将表头指向地址(100的地址) 赋给 400节点存放的指向地址 ,然后再把400节点存放的地址 赋给 表头


实现代码:

def add(self, item):
    """头部添加节点"""
        #添加的节点指向_head
        node.next = self._head
        # 移到链表尾部,将尾部节点的next指向node
        self._head = node

我们这个代码满足当单链列表为空的情况,所以不需要考虑特殊情况。


代码验证:

class SingleNode(object):
    """单链表的结点"""
    def __init__(self,item):
        # _item存放数据元素
        self.item = item
        # _next是下一个节点的标识
        self.next = 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 = 0
        # 尾节点指向None,当未到达尾部时
        while cur != None:
            count += 1
            # 将cur后移一个节点
            cur = cur.next
        return count

    def travel(self):
        """遍历链表"""
        cur = self._head
        while cur != None:
            print(cur.item)
            cur = cur.next

    def append(self, item):
        """尾部添加元素"""
        node = SingleNode(item)
        # 先判断链表是否为空,若是空链表,则将_head指向新节点
        if self.is_empty():
            self._head = node
        # 若不为空,则找到尾部,将尾节点的next指向新节点
        else:
            cur = self._head
            while cur.next != None:
                cur = cur.next
            cur.next = node

    def add(self, item):
        """头部添加节点"""
        node = SingleNode(item)
        if self.is_empty():
            self._head = node
            node.next = self._head
        else:
            #添加的节点指向_head
            node.next = self._head
            # 移到链表尾部,将尾部节点的next指向node
            self._head = node



if __name__ == '__main__':

    list = SingleLinkList()


    list.append(4)
    list.append(9)
    list.append(8)
    list.travel()
    print('*******')

    list.add(10)
    list.travel()

4
9
8


10
4
9
8
发现完全可以实现。




在指定位置添加元素

指定位置插入参数,需要在传递一个 pos参数 ,也就是存放位置参数。

pos 是从0开始的。
头节点的位置是0。

def insert(self, pos, item):
        """在指定位置添加节点"""
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):
            self.append(item)
        else:
            node = Node(item)
            cur = self._head
            count = 0
            # 移动到指定位置的前一个位置
            while count < (pos-1):
                count += 1
                cur = cur.next
            node.next = cur.next
            cur.next = node

if 和elif用于:首先排除,输入的数为不在单链表范围内的情况

语句类似于遍历的效果

node = Node(item) 语句为生成一个新的节点。

cur必须移动到,pos插入位置的前一个位置(pos-1)处,

python word 制定位置添加文字 python 列表指定位置添加_python_02



实践验证:

class SingleNode(object):
    """单链表的结点"""
    def __init__(self,item):
        # _item存放数据元素
        self.item = item
        # _next是下一个节点的标识
        self.next = 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 = 0
        # 尾节点指向None,当未到达尾部时
        while cur != None:
            count += 1
            # 将cur后移一个节点
            cur = cur.next
        return count

    def travel(self):
        """遍历链表"""
        cur = self._head
        while cur != None:
            print(cur.item)
            cur = cur.next

    def append(self, item):
        """尾部添加元素"""
        node = SingleNode(item)
        # 先判断链表是否为空,若是空链表,则将_head指向新节点
        if self.is_empty():
            self._head = node
        # 若不为空,则找到尾部,将尾节点的next指向新节点
        else:
            cur = self._head
            while cur.next != None:
                cur = cur.next
            cur.next = node

    def add(self, item):
        """头部添加节点"""
        node = SingleNode(item)
        if self.is_empty():
            self._head = node
            node.next = self._head
        else:
            #添加的节点指向_head
            node.next = self._head
            # 移到链表尾部,将尾部节点的next指向node
            self._head = node


    def insert(self, pos, item):
        """在指定位置添加节点"""
        if pos <= 0:
            self.add(item)
        elif pos > (self.length() - 1):
            self.append(item)
        else:
            node = SingleNode(item)
            cur = self._head
            count = 0
            # 移动到指定位置的前一个位置
            while count < (pos - 1):
                count += 1
                cur = cur.next
            node.next = cur.next
            cur.next = node


if __name__ == '__main__':

    list = SingleLinkList()


    list.append(4)
    list.append(9)
    list.append(8)
    list.travel()
    print('*******')

    list.insert(2,2828)
    list.travel()

4
9
8


4
9
2828
8

可以看到,在第二个偏移位置处插入了 新元素。