파이썬(python)의 자료구조

3. 파이썬의 링크드 리스트

인공지능파이썬 2024. 10. 15. 17:01
1. 링크드 리스트(Linked list)

- 떨어진 곳에 존재하는 데이터를 화살표로 연결하여 관리하는 구조
- C언어에서느  중요한 자료구조이지만, 파이썬에는 리스트 타입이 링크드리스트 역할도 이미 지원함
-데이터의 삽입과 삭제가 매우 빠름

2. 링크드 리스트 용어
- 노드(Node) : 데이터 저장 단위(데이터, 포인터)로 구성
- 포인터(Pointer ) : 각 노드안에서 다음이나 이전의 노드와의 연결정보를 가지고 있는 공간


#링크드 리스트 구현
파이썬에서는 링크드 리스트를 구현할때 클래스를 주로 활용

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


# Node 객체와 Node 객체의 연결하기(포인터 활용)
node1 = Node(1)
node2 = Node(2)
print(node1)
print(node2)
-->
<__main__.Node object at 0x782ce942c820>
<__main__.Node object at 0x782ce942c3a0>



node1.next = node2
head = node1

#링크드 리스트로 데이터 추가하기
class Node:
  def __init__(self,data):
    self.data = data
    self.next = None
  def add(self, data):
    node = head
    while node.next:
      node = node.next
    node.next = Node(data)


node1 = Node(1)
head = node1
for index in range(2, 11):
    node1.add(index)
    

#링크드 리스트 데이터 출력하기
node = head
while node.next:
  print(node.data)
  node = node.next
print(node.data)

-->
1
2
3
4
5
6
7
8
9
10


## 문제 1
* 3.5 현재 링크드리스트 객체에 3.5 데이터를 삽입하려고함
* (단, 3.534 사이에 넣을 수 있도록 함)
데이터를 삽입
node2 = Node(3.5)
node = head
search = False
while not search:
  if node.data == 3:
    search = True
  else:
    node = node.next

node_next = node.next # 3번 노드의 포인터에 저장된 4번주소를 node_next에 넣어줌
node.next = node2 #3번 노드의 포인터에 3.5 의 주소를 넣어줌
node2.next = node_next #3.5의 노드의 포인터에 4의 주소를 넣어줌

node = head
while node.next:
  print(node.data)
  node = node.next
print(node.data)
-->
1
2
3
3.5
4
5
6
7
8
9
10


문제 2
링크드 리스트를 객체지향 프로그래밍으로 구현하기

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


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

  def add(self, data): #  노드를 추가
      if self.head == None:
        self.head = None(data)
      else:
          node = self.head
          while node.next:
            node = node.next
          node.next = Node(data)

  def node_print(self): #모든 노드를 출력
    node = self.head
    while node:
      print(node,data)
      node = node.next

  def delete(self, data):
    #head에 노드가 없을 경우
    if self.head == None:
      print('head에 노드가 없습니다.')
      return

    #지우려는 값이 헤드에 있는경우
    if self.head.data == data:
      print('지우려는 값이 head에 있습니다.')
      temp = self.head
      self.head = self.head.next
      del temp
      #지우려는 값이 head에 없는경우
    else:
      print('지우려는 값이 head에 없습니다.')
      node = self.head
      while node.next:
        if node.next.data == data:
          temp = node.next
          node.next = node.next.next
          del temp
          return
        else:
          node = node.next

linkedlist = NodeMgmt(0)
linkedlist.delete(4)
-->
지우려는 값이 head에 없습니다.

 

728x90
LIST

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

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