단일 목록
링크 된리스트 데이터 노드에 의해 표현되는 사슬의 단일 연결리스트 데이터 구조는, 각 노드를 상기 데이터 요소 및 조성물의 하나 개의 데이터 요소를 가리키는 포인터는, 상기 어드레스 포인터는 각 노드에 연결된다.
노골적 : 단일 연결리스트는 노드의 숫자로 구성되어, 포인터와 각각의 후속 노드를 가리키는 이전 노드에서 노드 사이에 연결되어 있습니다.
(여기에 대해 이야기하는 것은 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()
이러한 기능의 위의 방법은 비교적 간단하다, 깊은 알고리즘에 도달한다-후속하지만 오래 배우고 자신의 손을 연습하고 심층적 인 운동의 몇 가지 예를 찾을 수있는 인내로, 그것은 문제가 전혀 없습니다.