数据结构算法之链表

November 13, 2017

链表面试总结,使用python实现,参考:https://www.cnblogs.com/lixiaohui-ambition/archive/2012/09/25/2703195.html

#coding:utf-8

# 定义链表
class ListNode:
    def __init__(self):
        self.data = None
        self.pnext = None

# 链表操作类
class ListNode_handle:
    def __init__(self):
        self.cur_node = None
    
    # 链表添加元素
    def add(self,data):
        ln = ListNode()
        ln.data = data
        
        ln.pnext = self.cur_node
        self.cur_node = ln
        return ln
    
    # 打印链表
    def prt(self,ln):
        while ln:
            print(ln.data,end="  ")
            ln = ln.pnext
    # 逆序输出
    def _reverse(self,ln):
        _list = []
        while ln:
            _list.append(ln.data)
            ln = ln.pnext
        ln_2 = ListNode()
        ln_h = ListNode_handle()
        for i in _list:
            ln_2 = ln_h.add(i)
        return ln_2
    
    # 求链表的长度
    def _length(self,ln):
        _len = 0
        while ln:
            _len += 1
            ln = ln.pnext
        return _len
    
    # 查找指定位置的节点
    def _find_loc(self,ln,loc):
        _sum = 0
        while ln and _sum != loc:
            _sum += 1
            ln = ln.pnext
        return ln.data
    
    # 判断某个节点是否在链表中
    def _exist(self,ln,data):
        flag = False
        while ln and data != ln.data:
            ln = ln.pnext
        return flag

# 创建链表   
ln = ListNode()
ln_h = ListNode_handle()
a = [1,4,2,5,8,5,7,9]
for i in a:
    ln = ln_h.add(i)

print("正序输出...")
ln_h.prt(ln)

print("\n\n逆序输出...")
ln_2 = ln_h._reverse(ln)
ln_h.prt(ln_2)

# 求链表ln的长度
length = ln_h._length(ln)
print("\n\nln的长度为:",length)

# 查找链表ln中的倒数第3个节点
data = ln_h._find_loc(ln,ln_h._length(ln)-3)
print("\n\n倒数第三个节点为:",data)

# 返回某个节点在链表中的位置
loc = ln_h._loc(ln,5)

# 判断某个节点是否在链表中
flag = ln_h._exist(ln,5)
print("\n\n5是否存在与链表ln中:",end=" ")
if flag:
    print("Yes")
else:
    print("No")