# 数据结构学习--单链表(python)

### 概念

，另一个是指向下一个结点地址的指针域。根据指针的指向，链表能形成不同的结构，例如

### 实现

class Node:
"""
链点
"""

def __init__(self, data):
self.data = data    # 数据域
self.next = None    # 指针域

"""
单链表
"""

self._length = None

# 向链表中添加新链点
def append(self, value):
self._length = None
new_node = Node(value)
# 将头部节点指向临时变量
# 当头部节点存在时
# 循环遍历到链表的最后一个节点
while current.next:
current = current.next
current.next = new_node
# 当头部节点不存在时
else:

# 判断链表是否为空
def is_empty(self):

# 向链表任意位置插入元素
def insert(self, position, value):
self._length = None
new_node = Node(value)
# 判断插入位置是否在链表的索引范围内
if position < 0 or position > self.get_length():
raise IndexError('Out of linked list range.')

# 当插入位置为头节点时
if position == 0:
return
# 当插入位置不在头节点时,遍历链表找到插入位置,插入新节点
i = 0
while i < position:
pre, current = current, current.next
i += 1
pre.next, new_node.next = new_node, current

# 删除指定位置的节点
def remove(self, position):
self._length = None
# 判断删除位置是否在链表的索引范围内
if position < 0 or position > self.get_length() - 1:
raise IndexError('Position out of linked list range.')

i = 0
# 当删除位置为头节点时
if position == i:
return

# 当删除位置不是头节点时,遍历链表找到删除位置
i += 1
prev, current = current, current.next
while i != position:
prev, current = current, current.next
i += 1
prev.next, current.next = current.next, None

# 获取链表长度
def get_length(self):
if self._length is not None:
return self._length
length = 0
while current is not None:
length += 1
current = current.next
self._length = length
return length

# 遍历链表,并依次打印节点数据
def print_list(self):
while current is not None:
print(current.data)
current = current.next

# 将链表反转
def reverse(self):
prev = None
while current is not None:
# next_node = current.next
# current.next = prev
# prev = current
# current = next_node
next_node, current.next = current.next, prev
prev, current = current, next_node

# 将列表转换为链表
def init_list(self, data_list):
for item in data_list[1:]:
node = Node(item)
current.next, current = node, node

# 替换指定位置的节点
def replace(self, position, value):
# 判断替换位置是否在链表索引范围内
if position < 0 or position > self.get_length() - 1:
raise IndexError("Position out of linked-list range.")
_node = Node(value)
i = 0
if position == 0:
_current.next = None
else:
i += 1
_prev, _current = _current, _current.next
while i != position:
i += 1
_prev, _current = _current, _current.next
_prev.next, _node.next = _node, _current.next
_current.next = None

# 返回给定值的第一个节点索引
def index(self, value):
i = 0
while _current is not None:
if _current.data == value:
return i
i += 1
_current = _current.next
return -1

def __getitem__(self, position):
if position < 0 or position > self.get_length() - 1:
raise IndexError("Position out of linked-list range.")