파이썬(python)의 자료구조

4. 파이썬의 더블 링크드 리스트

인공지능파이썬 2024. 10. 15. 17:07
1. 더블 링크드 리스트
- 양방향으로 연결되어 있어서 노드 탐색이 양쪽으로 모두 가능


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


class NodeMgmt:
  def __init__(self, data):
    self.head = Node(data)
    self.tail = self.head

  def insert(self, data):
    if self.head == None:
      self.head = Node(data)
      self.tail = self.head
    else:
      node = self.head
    while node.next:
      node = node.next
    new = Node(data)
    node.next = new
    new,prev = node
    self.tail = new

  def node_print(self):
    node = self.head
    while node:
      print(node.data)
      node = node.next

  def sesrch_from_head(self, data):
      pass

  def sesrch_from_tail(self, data):
      pass


double_linkedlist.node_print()

--> 
0
1

 

#문제1
데이터를 앞에서부터 검색하여 해당 값이 존재하는경우 그 값을 반환하고, 존재하지 않으면 false를 반환

#문제2
데이터를 뒤에서부터 검색하여 해당값이 존재하는 경우 그 값을 반환하고 존재하지 않으면 false를 반환

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

class NodeMgmt:
  def __init__(self, data):
    self.head = Node(data)
    self.tail = self.head

  def insert(self, data):
    if self.head == None:
      self.head = Node(data)
      self.tail = self.head
    else:
      node = self.head
    while node.next:
      node = node.next
    new = Node(data)
    node.next = new
    new,prev = node
    self.tail = new

  def node_print(self):
    node = self.head
    while node:
      print(node.data)
      node = node.next

  def sesrch_from_head(self, data):
      if self.head == None:
        return False
      node = self.head
      while node:
        if node.data == data:
          return node.data
        else:
          node = node.next
      return False

  def sesrch_from_tail(self, data):
      if self.tail == None:
        return False
      node = self.tail
      while node:
        if node.data == data:
          return node.data
        else:
          node = node.prev
      return False

 

#문제 3
* 위 코드에서 노드 데이터가 특정 숫자인 노드 앞에 데이터를 추가하는 메서드를 만들고 테스트해보자.
(단,기준값을 찾지 못한 경우 데이터를 삽입하지 않음)

```
insert+before(삽입할 데이터, 기준값)
삽입할 데이터 : 실제 삽입될 데이터
기준값 : 기준값 앞에 데이터가 삽입되도록 함

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

class NodeMgmt:
    def __init__(self, data):
        self.head = Node(data)
        self.tail = self.head

    def insert(self, data):
        if self.head == None:
            self.head = Node(data)
            self.tail = self.head
        else:
            node = self.head
            while node.next:
                node = node.next
            new = Node(data)
            node.next = new
            new.prev = node
            self.tail = new

    def node_print(self):
        node = self.head
        while node:
            print(node.data)
            node = node.next

    def search_from_head(self, data):
        if self.head == None:
            return False
        node = self.head
        while node:
            if node.data == data:
                return node.data
            else:
                node = node.next
        return False

    def search_from_tail(self, data):
        if self.tail == None:
            return False
        node = self.tail
        while node:
            if node.data == data:
                return node.data
            else:
                node = node.prev
        return False

    def insert_before(self, data, after_data):
        if self.head == None:
            self.head = Node(data)
            return True
        else:
            node = self.tail
            while node.data != after_data:
                node = node.prev
                if node == None:
                    return False
            new = Node(data)
            before_new = node.prev
            before_new.next = new
            new.prev = before_new
            new.next = node
            node.prev = new
            return True


double_linkedlist = NodeMgmt(0)

for data in range(1, 11):
    double_linkedlist.insert(data)

double_linkedlist.node_print()
-->
0
1
2
3
4
5
6
7
8
9
10

 

728x90
LIST

'파이썬(python)의 자료구조' 카테고리의 다른 글

6. 트리  (0) 2024.10.21
5. 파이썬의 해시 테이블  (2) 2024.10.18
3. 파이썬의 링크드 리스트  (0) 2024.10.15
2. 파이썬의 큐와 스택  (0) 2024.10.15
1. 파이썬의 자료 구조  (0) 2024.10.15