Python数据结构与算法:第3-7课时:单链表查找和删除元素




查找某个节点是否存在:

def search(self,item):
    cur = self._head
    while cur != None:
        if cur.item == item:
            return True
        else:
            cur = cur.next
        return False

这个写法包含了链表若为空集的特殊情况。




删除元素:

需要遍历整个列表:

比如我们要把,400这个对象从单链列表种删除。

python链表删除 python单链表 删除元素_删除元素


我们只需要将游标 cur 指向400,判断该元素为目标删除元素,然后把20指向的地址换成 300的地址就可以了。

所以还需要一个游标 pre,用于指向20这个节点,才能实现该功能。


python链表删除 python单链表 删除元素_指定位置_02


这两个语句可以实现pre指针永远比cur落后一个节点:

python链表删除 python单链表 删除元素_删除元素_03



特殊情况;若为空链表

直接不操作。


特殊情况,要删除的元素就是头节点:

直接把self.head 变为 首节点指向的下一个地址。

python链表删除 python单链表 删除元素_链表_04

特殊情况,若该被删除的节点恰好在最尾部,

直接把最后一个被删除的节点指向的地址(None)赋值给 前一个节点指向的地址。就ok



实现代码:

def remove(self,item):
    cur = self._head
    pre = None
    # 让pre首先不指向任何东西

    while cur != None:
        if cur.item == item:
            if cur == self._head:
                #先判断此节点是否为头节点
                self.head = cur.next
                #是头节点那么直接就将头节点指向cur.next
            else:
                pre.next = cur.next
            break
		#如果删除完后,直接退出循环 
        else:
            pre = cur
            cur = cur.next


测试代码:

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

    def search(self,item):
        cur = self._head
        while cur != None:
            if cur.item == item:
                return True
            else:
                cur = cur.next
            return False

    def remove(self,item):
        cur = self._head
        pre = None
        # 让pre首先不指向任何东西

        while cur != None:
            if cur.item == item:
                if cur == self._head:
                    #先判断此节点是否为头节点
                    self.head = cur.next
                    #是头节点那么直接就将头节点指向cur.next
                else:
                    pre.next = cur.next
                break
            else:
                pre = cur
                cur = cur.next


if __name__ == '__main__':

    list = SingleLinkList()


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

    list.remove(9)
    list.travel()

4
9
8


4
8

下一个节点叫后继节点。