1.双链表是什么?
双向循环链表是基于双向链表实现的。
双向链表也叫双链表,它的每个数据结点中都有两个指针,分别指向后继节点和前驱节点,所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点;
而双向循环链表则是链表的头部和尾部节点相互连接;
2.用代码表示双链表
举例题目: 输入一个链表,输出该链表中倒数第k个结点.
代码如下:
#!/usr/bin/env python
#案例:Fu Xianjun. All Rights Reserved.
class Node(object):
def __init__(self,val): # 存放结点的数据域
self.val = val #前驱指针
self.prev = None # 后继指针
self.next = None
class DoubleLinkedList(object):
def __init__(self):
self.head = None
self.tail = None
#判断双链表是否为空
def empty(self):
return self.head is None
#计算链表的长度
def length(self):
size = 0 #size用来计算链表长度
cur = self.head #声明cur指针,用来遍历链表
# 当cur指针没有指向空
while cur != None:
size += 1 #链表长度加1
# cur指针指向当前节点的后继节点
# print(str(size)+" "+str(cur.val))
cur = cur.next
return size
#遍历输出链表中的值
def traversal(self):
cur = self.head
while cur != None:
print(cur.val,end=" ")
cur = cur.next
print()
# 尾插法
def append(self,val):
newNode = Node(val)
if self.empty():
self.head = newNode
self.tail = newNode
else:
self.tail.next = newNode
newNode.prev = self.tail
self.tail = newNode
# 输出从倒数第k个结点到最后的所有结点
def getKthFromEnd(self,k):
# 声明cur指针,用来遍历链表
cur = self.head
#获取链表总长度
kdx = self.length()
#逆向思维寻找倒数第k个结点
dst = kdx-k
#cur找到k位置与头的结点
for i in range(dst):
for i in range(1):
self.prev = None
cur = cur.next
#设为空
cur.prev = None
#重新定义head(头结点)
self.head = cur
#遍历输出链表中的值
self.traversal()
if __name__ == "__main__":
li = DoubleLinkedList()
li.append('a')
li.append('b')
li.append('c')
li.append('d')
li.append('e')
print("原链表:",end="")
li.traversal()
print("输出后3个结点:",end="")
li.getKthFromEnd(3)
print("输出后2个结点:",end="")
li.getKthFromEnd(2)