데이터 구조 및 알고리즘(python) - 단방향 연결 목록

연결된 목록은 노드와 방향이 지정된 링크로 구성됩니다. 따라서 노드 클래스와 단방향 연결 목록 작업 클래스의 두 가지 클래스를 생성할 수 있습니다.

노드 클래스:

노드 클래스는 단일 연결 목록의 노드를 구성하는 데 사용되며 노드에는 값과 포인팅의 두 부분이 포함됩니다. (노드 클래스가 방향성이 없다고 가정하므로 다음 매개변수의 기본값은 None입니다.)

class Node:
    def __init__(self, val, next=None):
        self.val = val    #将val传入的值赋给self.val
        self.next = next  #next始终为None,不具备指向性,在实例化时进行指向

다음은 인스턴스화의 예입니다.

node1(val=1), node2(val=2)를 생성하고 node1이 node2를 가리키도록 합니다.

node1 = Node(1)     # ①
node2 = Node(2)     # ②
node1.next = node2  # ③

 단방향 연결 목록 클래스:

단일 연결 리스트 클래스를 만들 때 연결 리스트의 시작 부분만 나타내는 헤드 노드를 먼저 만들어야 하므로 할당이 필요하지 않습니다.

1. 헤드 노드를 생성합니다.

class LinkList:
    def __init__(self):
        self.head = Node(None)  # 通过之前的Node类创建一个链表的头结点

다음은 인스턴스화의 예입니다.

헤드 노드와 노드가 있는 단일 연결 리스트를 만듭니다.

아이디어: 먼저 헤드 노드, 노드를 생성한 다음 헤드 노드를 노드로 가리킵니다.

l = LinkList()  # 用l将linklist实例化,之后l就具有了linklist所具有的属性
node = Node(1)  # 生成节点
l.head.next = node  # l.head就是生成的头节点:Node(none),图中用node_head表示
                    # .next表示将头节点指向node

위의 그림에서 헤드 노드를 통해 노드를 찾는 방법은 무엇입니까? —— l.head.next는 노드 값에 어떻게 액세스합니까? -l.head.next.val

 2. 목록을 연결된 목록으로 변환합니다.

아이디어: 목록에 액세스하여 루프의 각 목록에 있는 값에 노드를 추가합니다. 현재 도달한 노드를 나타내는 임시 변수 p를 도입합니다. 처음에 p는 헤드 노드에 있고 헤드 노드에 node1을 추가한 다음 p는 node1로 이동하고 node1에 node2를 추가한 다음 p는 node2로 이동하고 node2에 node3을 추가합니다... 목록의 요소가 모두 추가될 때까지.

# 将列表转换为链表
def init_list(self, list_):
    p = self.head            # 将头节点赋给p 
    for item in list_:       # 循环遍历列表
        p.next = Node(item)  # 将下一个节点添加在当前节点(p)之后
        p = p.next           # 将p移动到下一个节点

3. 연결된 목록을 순회하고 값을 반환합니다.

# 遍历列表并返回值
def show(self):
    p = self.head.next
    while p is not None:
        print(p.val)
        p = p.next

4. 연결된 목록 모두 지우기

아이디어: 다음 헤드 노드를 없음으로 설정하십시오. Python은 나머지 데이터를 자체적으로 정리합니다.

# 清空全部链表
def clear(self):
    self.head.next = None

 5. 비어 있는지 확인

# 检查链表是否为空
def is_empty(self):
    if self.head.next is None:
        return True
    else:
        return False

6. 삽입

① 테일 플러깅 방법:

아이디어: p를 마지막 노드로 이동하고 마지막 노드 뒤에 노드 추가

# 在链表末尾插入一个节点
def append(self, val):
    p = self.head
    while p.next is not None:
        p = p.next
    p.next = Node(val)

②헤드 삽입 방법:

아이디어: 삽입할 노드의 다음 노드를 헤드 노드의 다음 노드로 가리키고 헤드 노드의 다음 노드를 이 노드로 가리킵니다.

def head_insert(self, val):
    node = Node(val)           # ①
    node.next = self.head.next # ②
    self.head.next = node      # ③

③ 임의 삽입 방식:

아이디어: 임시 변수 p를 도입하여 현재 노드 위치를 나타냅니다. p를 index-1의 위치로 이동시키고 헤드 삽입 방법과 동일한 아이디어를 사용하여 삽입합니다.

# 在index处插入节点
def insert(self, index, val):
    p = self.head
    for i in range(index):
        if p.next is None:
            break
        p = p.next
    node = Node(val)
    node.next = p.next
    p.next = node

7. 노드 위치를 전달하고 해당 값을 얻습니다.

def get_index(self, index):
    p = self.head.next
    for i in range(index):
        if p.next is None:
            raise IndexError("list index is out of range")
        p = p.next
    return p.val

8. 노드 삭제 작업(값으로 삭제)

def delete(self, x):
    p = self.head
    while p.next and p.next.val != x:
        p = p.next
    if p.next is None:
        raise ValueError("x is not found")
    else:
        p.next = p.next.next
    

 

추천

출처blog.csdn.net/weixin_45958695/article/details/128174502