总结一下链表相关的操作技巧,直接上代码。
# -*- coding: utf-8 -*-
class Node(object):
'''节点类,记录值和下一节点指针'''
def __init__(self, value, nt_node):
self.value = value
self.nt_node = nt_node
def show_chain(f_node):
'''顺序打印链表元素'''
order_list = []
c_node = f_node
while c_node.nt_node is not None:
order_list.append(c_node.value)
c_node = c_node.nt_node
order_list.append(c_node.value)
print(order_list)
def make_chain(chain_len: int):
'''创建头节点,并生成后续节点,返回头节点'''
f_node = Node(0, None)
c_node = f_node
for i in range(1, chain_len):
new_node = Node(i, None)
c_node.nt_node = new_node
c_node = new_node
return f_node
def reverse_normal(f_node):
'''反转链表'''
_pre, _cur, _next = None, f_node, None
while _cur.nt_node is not None:
_next = _cur.nt_node
_cur.nt_node = _pre
_pre, _cur = _cur, _next
_cur.nt_node = _pre
return _cur
def reverse_recursion(f_node):
'''递归反转'''
if (f_node is None) or (f_node.nt_node is None):
return f_node
head_node = reverse_recursion(f_node.nt_node)
f_node.nt_node.nt_node = f_node
f_node.nt_node = None
return head_node
def mide_chain(f_node):
'''找出链表的中间节点'''
_fast, _slow = f_node, f_node
while (_fast is not None) and (_fast.nt_node) is not None:
_slow = _slow.nt_node
_fast = _fast.nt_node.nt_node
print(_slow.value)
def exchange_chain(f_node):
'''两两节点对换'''
if (f_node is None) or (f_node.nt_node is None):
return f_node
_temp = f_node.nt_node.nt_node
f_node.nt_node.nt_node = f_node
_next = f_node.nt_node
f_node.nt_node = exchange_chain(_temp)
return _next
if __name__ == '__main__':
'''初始化链表并打印;
结果:[0, 1, 2, 3, 4, 5, 6, 7, 8]'''
node_chain = make_chain()
show_chain(node_chain)
'''反转链表并打印;
结果:[8, 7, 6, 5, 4, 3, 2, 1, 0]'''
rev_chain = reverse_normal(node_chain)
show_chain(rev_chain)
'''反转反转后的链表(与原链表一致)并打印;
结果:[0, 1, 2, 3, 4, 5, 6, 7, 8]'''
rev_rev_chain = reverse_recursion(rev_chain)
show_chain(rev_rev_chain)
'''一个链表两两交换
结果:[1, 0, 3, 2, 5, 4, 7, 6, 8]'''
show_chain(exchange_chain(make_chain()))
'''链表的中间节点'''
mide_chain(make_chain())