본문 바로가기

6.5. Data Sturcture

6/14(수) IT 자료구조(3일차) / 4.리스트

 

 

4. 리스트(List)

 

4-2. LinkedList

4-2-3. 탐색

.get(i)

주어진 인덱스 i의 항목을 반환.
조건이 참이면 i에 해당하는 노드 값 또는 데이터를 반환하고
i가 유효한 범위 내에 있지 않을 때 '범위 밖입니다'라는 메시지를 출력함.

get(i):  # .get(i) : i번째 원소를 가져오는 것을 의미.
  if i >= 0 and i < num_items:
    return get_node(i).item
  else:
    print('범위 밖입니다.')

.get_node(i)
주어진 인덱스 i에 해당하는 노드를 찾아서 반환.

반복문을 통해 연결 리스트의 노드를 탐색하고, i+1번째 노드를 반환.
get_node(i):
  curr = head
  for index in range(i+1):
    curr = curr.next  # 현재 노드(i)의 다음 노드(i+1)을 가리킴.
  return curr

.index(x)

주어진 값 x의 인덱스를 찾아서 반환. 반복문을 통해 연결 리스트의 노드를 탐색하고, 값을 비교하여 인덱스를 찾음.

값이 일치하는 경우 해당 인덱스를 반환하고, 값이 존재하지 않는 경우 None을 반환.

index(x):
  curr = head # 더미노드
  for index in range(num_items):
    curr = curr.next
    if curr.item = x:
      return index
  return None


4-2-4. 기타

.is_empty()

연결 리스트가 비어있는지를 확인하는 함수.

num_items 변수가 0이면 True를 반환하고, 그렇지 않으면 False를 반환.
is_empty():
  return num_items == 0

.size()
연결 리스트의 크기 또는 항목 수를 반환하는 함수.

num_items 변수를 반환하여 연결 리스트의 크기를 알 수 있음.
size():
  return num_items

.clear()
새로운 노드를 생성하고 연결 리스트의 헤드를 설정하며, 

연결 리스트의 항목 수를 0으로 초기화하는 작업을 수행.
new_node.next = None
head = new_node
num_items = 0


4-3. 구현

class ListNode:
  def __init__(self, new_item, next_node):
    self.item = new_item
    self.next = next_node

class LinkedListBasic:
  def __init__(self):
    self.head = ListNode('dummyhead', None)
    self.num_items = 0

  # 추가 : 특정 위치 삽입
  def insert(self, i: int, new_item):
    if i >= 0 and i <= self.num_items:
      prev = self.get_node(i - 1)
      new_node = ListNode(new_item, prev.next)
      prev.next = new_node
      self.num_items += 1
    else:
      print(f'{i}는 범위 안의 수가 아닙니다.')

  # 특정 노드 위치 찾기 : 인덱스가 없어서 직접 찾아야함
  def get_node(self, i: int) -> ListNode:
    curr = self.head
    for index in range(i+1):
      curr = curr.next
    return curr

  # 추가 : 가장 마지막에 삽입
  def append(self, new_item):
    prev = self.get_node(self.num_items - 1)
    new_node = ListNode(new_item, None)
    prev.next = new_node
    self.num_items += 1

  # 삭제 : i번째
  def pop(self, i: int):
    if i >= 0 and i < self.num_items:
      prev = self.get_node(i - 1)
      # prev.next = prev.next.next
      curr = prev.next
      prev.next = curr.next
      self.num_items -= 1
      return curr.item
    else:
      return None

  def popi(self, i: int = -1):
    if i >= 0 and i < self.num_items:
      prev = self.get_node(i - 1)
      curr = prev.next
      prev.next = curr.next
      self.num_items -= 1
      return curr.item
    elif i < 0:
      true_index = self.num_items + i
      prev = self.get_node(true_index - 1)
      curr = prev.next
      prev.next = curr.next
      self.num_items -= 1
      return curr.item
    else:
      return None

  # 삭제 : 특정 인수
  def remove(self, x):
    (prev, curr) = self.find_node(x)
    if curr != None:
      prev.next = curr.next
      self.num_items -= 1

  def find_node(self, x):
    prev = self.head # 더미헤드부터 시작
    curr = prev.next # 0번 노드
    while curr != None:
      if curr.item == x:
        return (prev, curr)
      else:
        prev = curr
        curr = curr.next
    return (None, None)

  # 탐색 : i번째 데이터
  def get(self, i: int):
    if self.is_empty():
      return None
    if i >= 0 and i < self.num_items:
      return self.get_node(i).item
    else:
      return None

  # 탐색 : x가 몇 번째 원소인지 알려주는 것
  def index(self, x) -> int:
    curr = self.head.next # 0번 노드
    for index in range(self.num_items):
      if curr.item == x:
        return index
      else:
        curr = curr.next
    return -999

  # 기타
  def is_empty(self) -> bool:
    return self.num_items == 0

  def size(self) -> int:
    return self.num_items

  def clear(self):
    self.head = ListNode('header', None)
    self.num_items = 0

  # 추가
  # 같은 원소의 개수 세기
  def count(self, x) -> int:
    cnt = 0
    curr = self.head.next # 0번 노드
    while curr != None:
      if curr.item == x:
        cnt += 1
      curr = curr.next
    return cnt

  # 같은 리스트 연결하기
  def extend(self, a: LinkedListBasic):
    # for index in a:
    for index in range(a.size()):
      self.append(a.get(index))

  # 동일한 리스트로 복사하기
  def copy(self):
    a = LinkedListBasic()
    for index in range(self.num_items):
      a.append(self.get(index))
    return a