#!/usr/bin/env python
# -*-coding:utf-8-*-
import sys
"""
/*
* @Author: zuofanxiu
* @Date: 11/6/18 9:25 AM
* @file:linkList.py
* @Software: PyCharm
*/
"""
# 定义结点
class ListNode(object):
def __init__(self, value, p=0):
self.value = value
self.next = p
'''
链表基本操作
'''
class LinkList(object):
def __init__(self):
self.head = 0
def initList(self, list_value):
self.head = ListNode(list_value[0])
p = self.head
for value in list_value[1:]:
node = ListNode(value)
p.next = node
p = p.next
def printList(self):
p = self.head
while p != 0:
print p.value
p = p.next
def getLength(self):
p = self.head
length = 0
while p != 0:
length += 1
p = p.next
return length
def is_empty(self):
if self.getLength() == 0:
return True
else:
return False
def clear(self):
self.head = 0
def append(self, value):
q = ListNode(value)
if self.head == 0:
self.head = q
else:
p = self.head
while p.next != 0:
p = p.next
p.next = q
def getitem(self, index):
if self.is_empty():
print "LinkList is empty"
return
j = 0
p = self.head
while p.next != 0 and j < index:
p = p.next
j += 1
if j == index:
return p.value
else:
print "target is not exist!"
def insert(self, index, value):
if index < 0 or index > self.getLength():
print "index is illegal"
return
if index == 0:
q = ListNode(value)
p = self.head
self.head = q
q.next = p
else:
p = self.head
post = self.head
j = 0
while p != 0 and j < index:
post = p
p = p.next
j += 1
if index == j:
q = ListNode(value, p)
post.next = q
q.next = p
def delete(self, index):
if self.is_empty() or index < 0 or index >= self.getLength():
print "index is illegal"
return
if index == 0:
p = self.head
self.head = p.next
else:
p = self.head
post = self.head
j = 0
while p.next != 0 and j < index:
post = p
p = p.next
j += 1
if index == j:
post.next = p.next
def index(self, value):
if self.is_empty():
print "the linkList is empty"
return
p = self.head
i = 0
while p.next != 0 and not p.value == value:
p = p.next
i += 1
if p.value == value:
return i
else:
return -1
'''
删除单链表倒数第n个元素
使用快慢指针。快指针比慢指针提前n个单元。当快指针到达单链表尾部时,慢指针指向待删除节点的前节点。
'''
def delete_n(linkList, n):
p = linkList.head
q = linkList.head
while n:
q = q.next
n -= 1
# 删除第一个元素
if q == 0:
linkList.head = linkList.head.next
else:
while q.next != 0:
p = p.next
q = q.next
if q.next == 0:
p.next = p.next.next
def main():
l = LinkList()
l.initList([1, 2, 3, 4, 5])
l.printList()
# print(l.getLength())
# l.clear()
# l.printList()
print "===================="
#l.insert(1, 6)
#l.printList()
# print l.getitem(4)
# l.append(6)
# print l.index(50)
# l.delete(4)
# l.printList()
delete_n(l, 5)
l.printList()
if __name__ == "__main__":
sys.exit(main())