[] 데이터 구조 - 하나의 목록은, 간단한 단일 - 쇄 (매우 상세한 설명)을 만들 파이썬 사용

단일 목록

링크 된리스트 데이터 노드에 의해 표현되는 사슬의 단일 연결리스트 데이터 구조는, 각 노드를 상기 데이터 요소 및 조성물의 하나 개의 데이터 요소를 가리키는 포인터는, 상기 어드레스 포인터는 각 노드에 연결된다.

노골적 : 단일 연결리스트는 노드의 숫자로 구성되어, 포인터와 각각의 후속 노드를 가리키는 이전 노드에서 노드 사이에 연결되어 있습니다.

(여기에 대해 이야기하는 것은 C 언어 포인터로, 참조 그냥 가상 포인터)


다음은 각 기능을 설명하는 하나의 인스턴스를 생성하고 첫 분포의 일부 기능을 구현하는 것입니다, 그리고 마지막으로 전체 코드를 부여

첫째, 노드 클래스를 생성

어떤 데이터 요소와 하나 개의 데이터 요소를 가리키는 포인터를 포함

class Node(object):
    """创建单个结点类"""
    def __init__(self, data):
        self.data = data
        self.next = None

 그런 다음 클래스의 단일 목록을 만들

일부 기능을 포함하는 다음과 같은 기능이 클래스에 포함되는 물품.

단일 목록을 만들려면이 클래스에서, 우리는 먼저 헤드 노드를 초기화 할 수있는 초기화 함수를 작성

그런 다음 True를 반환, 비어있는 경우이 목록이 비어 있는지를 결정하는 함수를 작성

class SingleLinkedList(object):
    """创建一个单链表"""

    def __init__(self):
        self.head = None

    def is_empty(self):
        """判断链表是否为空"""
        return self.head is None

단일 사슬 길이를 구하는 함수를 작성

CUR로 현재 영어, 의미 : 이제, 노드는 현재의 포인터, 스크래치 노드를 나타냅니다

카운트는 노드가 비어 있지 않은 경우, 길이가 증가되고, 그 후 다시 현재 노드 포인터 (현재) 이동, 다음의 CUR CUR로 변경되면,리스트의 길이이다.

def length(self):
    """获取链表的长度"""
    cur = self.head
    count = 0
    while cur is not None:
        count += 1
        cur = cur.next
    return count

리스트의 선두에 요소를 추가

처음에 우리는 목록이 너무 새로운 노드가 새로운 것을, 새 노드를 만든 다음 원래 노드의 헤드 노드 포인터 포인트를 만들기 위해 새 노드에이 제목의 다음 헤드 노드 (머리)와 연계된다는 필요 헤드 노드입니다.

def add_fist(self, data):
    """在链表的头部添加元素"""
    node = Node(data)
    node.next = self.head
    self.head = node

목록의 마지막에 요소 추가

우리가 필요 이번에는 두 개의 사례를 고려해야 할 목록이 비어 목록이 비어 있지

목록이 비어있을 때, 우리는이 새로운 노드가 헤드 노드의 위치에 삽입 할 수 있습니다

목록이 비어 있지 않은 경우, 우리는 목록의 끝에 포인터를 이동해야, 새로운 노드가 위치에 삽입되는 끝에 추가됩니다 최종 노드.

def add_last(self, data):
    """在链表的尾部添加元素"""
    node = Node(data)
    if self.is_empty():
        self.head = node
    else:
        cur = self.head
        while cur.next is not None:
            cur = cur.next
        cur.next = node

목록에서 지정된 위치에있는 요소를 추가

우리는이 기능을 사용하면 인덱스를 지정해야합니다 : 목록, 데이터 요소의 위치를 ​​: 데이터 요소를

상황의 중간에 삽입되어, 오류 조건, 상황이 꼬리를 케이스에 삽입되어, 머리에 삽입 : 나는 네 가지 사례를 고려 왔어요

에러의 경우는 : 지정된 인덱스가리스트의 길이 이하가 제로 이상이며,이 위치에서 확실하지 않을 때, 이것은 에러로 판정

케이스의 헤드에 삽입 : 인덱스리스트의 상단에 삽입되어 0 인 경우는,이 ​​기능 이상 작성한 라인에 직접 호출 그래서.

케이스의 꼬리에 삽입 : 인덱스리스트의 길이 인 경우, 최종 표면리스트에 삽입하고, 또한, 직접 호출 할 수있다

사이에 삽입하는 경우 :이 경우는 특별한 경우가이고, 그 위치로 포인터를 이동 인덱스의 위치에 전에 첨가 한 다음 삽입 될되도록, 카운트 수를 계산하는 것이 필요하다. 중앙 아이디어는 원래 노드 CUR에 노드 포인터에 새 후계자 노드 점, 포인터가 새 노드 CUR 노드를 가리 키도록한다는 것이다.

(하나는 그 다음 우리가 너무 많은 경우를 분리 할 필요가 요청할 수도, 대답에 다른 하나의시보다 간결 방법은 예,이 또한이 기능을 수행 할 수있는 다른 방법을 사용하는 단지 방법입니다하지 않습니다 :?있다)

def insert_node(self, index, data):
    """在指定位置添加元素"""
    node = Node(data)
    if index < 0 or index > self.length():
        return False
    elif index == 0:
        self.add_fist()
    elif index == self.length():
        self.add_last()
    else:
        cur = self.head
        count = 0
        while count < index - 1:
            cur = cur.next
            count += 1
        node.next = cur.next
        cur.next = node

지정된 노드를 삭제

여기에 두 점 : 삭제 된 노드가 삭제 노드가 첫 번째 노드의 첫 번째 노드가 아닙니다

그것에 헤드 노드의 후속 노드에 첫 번째 노드의 제목에 직접 이러한 상황 : 삭제 된 노드는 첫 번째 노드입니다

이 상황이 요구 점차 찾으려면 포인터를 이동하고 때까지 요소가 삭제 될 찾을 : 삭제 된 노드는 첫 번째 노드가 아닙니다. 우리는 두 개의 노드를 필요 포인터를 노드 (현재 검색 노드), 그 이전 노드에

CUR는 초기화 시간 때문에 현재의 노드는 이전 노드의 사전 대신을 나타내므로, 헤드 노드가 아닌 헤드 노드 전구체 노드에 CUR 점, 그래서 없음으로 초기화. 그런 다음 시간에 뒤로 이동, 당신은 지정을 상호 교환 할 수 있습니다.

마지막으로, 우리는이, CUR 현재 지점입니다 노드를 삭제하는 것으로 그 이전의 후속 노드 cur.next에 우리 단지는 이전 노드 점, 따라서 접합 CUR의 중간을 건너 뛰는 그래서 하여 삭제를 완료.

def remove_node(self, data):
    """删除指定结点"""
    cur = self.head  # 指针指向的结点
    pre = None  # 指针指向结点的前一个
    if self.head == data:
        self.head.next = self.head
    else:
        while cur.data is not data:
            pre = cur
            cur = cur.next
        pre.next = cur.next

이 경우 지정된 노드를 찾기

마찬가지로 삭제 작업으로, 우리가 (현재 = cur.next) 다시보고 계속 찾으려는 노드에이를 발견했다.

def search_node_is_exist(self, data):
    """查找指定结点是否存在"""
    cur = self.head
    while cur is not None:
        if cur.data == data:
            return True
        else:
            cur = cur.next
    return False

통해 전체 목록을 인쇄

끊임없이 뒤로 보이는, 각 노드에 인쇄 할 보인다

def traversal(self):
    """遍历整个链表"""
    cur = self.head
    while cur is not None:
        print(cur.data)
        cur = cur.next

주요 기능 검사

위의 함수 호출

if __name__ == '__main__':
    lists = SingleLinkedList()
    lists.add_fist(2)
    lists.add_fist(1)
    lists.add_last(4)
    lists.insert_node(2, 3)
    lists.traversal()
    print(lists.is_empty())
    print(lists.length())
    lists.remove_node(4)
    print(lists.search_node_is_exist(3))
    lists.traversal()

 출력 샷

전체 코드

class Node(object):
    """创建单个结点类"""
    def __init__(self, data):
        self.data = data
        self.next = None


class SingleLinkedList(object):
    """创建一个单链表"""

    def __init__(self):
        self.head = None

    def is_empty(self):
        """判断链表是否为空"""
        return self.head is None

    def length(self):
        """获取链表的长度"""
        cur = self.head
        count = 0
        while cur is not None:
            count += 1
            cur = cur.next
        return count

    def add_fist(self, data):
        """在链表的头部添加元素"""
        node = Node(data)
        node.next = self.head
        self.head = node

    def add_last(self, data):
        """在链表的尾部添加元素"""
        node = Node(data)
        if self.is_empty():
            self.head = node
        else:
            cur = self.head
            while cur.next is not None:
                cur = cur.next
            cur.next = node

    def insert_node(self, index, data):
        """在指定位置添加元素"""
        node = Node(data)
        if index < 0 or index > self.length():
            return False
        elif index == 0:
            self.add_fist()
        elif index == self.length():
            self.add_last()
        else:
            cur = self.head
            count = 0
            while count < index - 1:
                cur = cur.next
                count += 1
            node.next = cur.next
            cur.next = node

    def remove_node(self, data):
        """删除指定结点"""
        cur = self.head  # 指针指向的结点
        pre = None  # 指针指向结点的前一个
        if self.head == data:
            self.head.next = self.head
        else:
            while cur.data is not data:
                pre = cur
                cur = cur.next
            pre.next = cur.next

    def search_node_is_exist(self, data):
        """查找指定结点是否存在"""
        cur = self.head
        while cur is not None:
            if cur.data == data:
                return True
            else:
                cur = cur.next
        return False

    def traversal(self):
        """遍历整个链表"""
        cur = self.head
        while cur is not None:
            print(cur.data)
            cur = cur.next


if __name__ == '__main__':
    lists = SingleLinkedList()
    lists.add_fist(2)
    lists.add_fist(1)
    lists.add_last(4)
    lists.insert_node(2, 3)
    lists.traversal()
    print(lists.is_empty())
    print(lists.length())
    lists.remove_node(4)
    print(lists.search_node_is_exist(3))
    lists.traversal()

이러한 기능의 위의 방법은 비교적 간단하다, 깊은 알고리즘에 도달한다-후속하지만 오래 배우고 자신의 손을 연습하고 심층적 인 운동의 몇 가지 예를 찾을 수있는 인내로, 그것은 문제가 전혀 없습니다. 

发布了12 篇原创文章 · 获赞 14 · 访问量 4439

추천

출처blog.csdn.net/weixin_42193813/article/details/104246847