پایتون

جلسه ۸۳: حذف براساس موقعیت در پایتون

در این درس یاد میگیریم که چگونه میتوانیم یک نود را بر اساس یک موقعیت داده شده، حذف کنیم. ما این مسئله را در یک مسیری مشابه مسیری که در درس قبلی انجام دادیم، حل خواهیم کرد.

مواردی که باید بررسی شوند

دوباره ما دو مورد زیر را برای پیاده‌سازی جداگانه بررسی میکنیم.

  • حذف یک نود در موقعیت ۰
  • حذف یک نود که در موقعیت ۰ نباشد.

پیاده‌سازی

بدون هیچ زحمتی سراغ پیاده‌سازی میرویم.

def delete_node_at_pos(self, pos):
  if self.head:
    cur_node = self.head
    if pos == 0:
      self.head = cur_node.next
      cur_node = None
      return

    prev = None
    count = 0
    while cur_node and count != pos:
        prev = cur_node 
        cur_node = cur_node.next
        count += 1

    if cur_node is None:
        return 

    prev.next = cur_node.next
    cur_node = None

توضیحات

متد delete_node_at_pos آرگومان pos را به عنوان یکی از ورودی ها میگیرد. اول از همه در خط ۲ بررسی میکنیم که ایا linked list ما خالی است یا نه. به سراغ خط ۳ میرویم البته اگر self.head مقدار None نداشته باشد. همانطور که قبلا بررسی کردیم، ما باید کارمان را فعلا زمانی که pos برابر ۰ است انجام دهیم. اگر pos برابر ۰ بود، این بدان معناست که میخواهیم نود head را حذف کنیم. در خط ۳، cur_node به طور پیش فرض به عنوان head در نظر گرفته شده است. سپس بررسی میکنیم که آیا pos برابر صفر است یا نه. اگر صفر بود، ما نود head را به مقدار next در  cur_node آپدیت میکنیم. و سپس مقدار cur_node را none کرده و از متد خارج میشویم(۷-۵). در حالت دیگر، یعنی حذف یک نود که در موقعیتی به غیر از صفر باشد را بررسی میکنیم، این کار در خط ۹ شروع میشود، ما یک prev با مقدار اولیه none تعریف کرده ایم. مقدار count را هم در ابتدا ۰ در نظر گرفته‌ایم. اکنون روی تک تک اعضای linked list حرکت میکنیم و مقادیر prev و cur_node را در خطوط ۱۲ و ۱۳ آپدیت میکنیم همچنین مقدار count را هم در هر تکرار یکی اضافه میکنیم(خط ۱۴). حلقه while زمانی تمام میشود که cur_node به مقدار none برسد یا هم مقدار count برابر با pos ما بشود، که در اینصورت cur_node نودی است که باید حذف گردد. کدها در خطوط  ۲۰-۱۶ شبیه متد delete_node است. امیدواریم که همه‌چیز تاکنون برای شما واضح بوده‌باشد. شما میتوانید این متد را با تمرین بیشتر در کد زیر، یاد بگیرید.

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


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

    def print_list(self):
        cur_node = self.head
        while cur_node:
            print(cur_node.data)
            cur_node = cur_node.next

    def append(self, data):
        new_node = Node(data)

        if self.head is None:
            self.head = new_node
            return

        last_node = self.head
        while last_node.next:
            last_node = last_node.next
        last_node.next = new_node

    def prepend(self, data):
        new_node = Node(data)

        new_node.next = self.head
        self.head = new_node

    def insert_after_node(self, prev_node, data):

        if not prev_node:
            print("Previous node does not exist.")
            return 

        new_node = Node(data)

        new_node.next = prev_node.next
        prev_node.next = new_node

    def delete_node(self, key):

        cur_node = self.head

        if cur_node and cur_node.data == key:
            self.head = cur_node.next
            cur_node = None
            return

        prev = None 
        while cur_node and cur_node.data != key:
            prev = cur_node
            cur_node = cur_node.next

        if cur_node is None:
            return 

        prev.next = cur_node.next
        cur_node = None

    def delete_node_at_pos(self, pos):
        if self.head:
            cur_node = self.head

            if pos == 0:
                self.head = cur_node.next
                cur_node = None
                return

            prev = None
            count = 0
            while cur_node and count != pos:
                prev = cur_node 
                cur_node = cur_node.next
                count += 1

            if cur_node is None:
                return 

            prev.next = cur_node.next
            cur_node = None


llist = LinkedList()
llist.append("A")
llist.append("B")
llist.append("C")
llist.append("D")

llist.delete_node_at_pos(0)

llist.print_list()

این ها همه روش‌های حذف نود ها در یک singly linked list بود. در درس بعدی یاد میگیریم که چگونه طول یک linked list را بیابیم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا