#!/usr/bin/env python
# encoding: utf-8
'''
Python程序员面试算法宝典---解题总结: 第1章 链表 1.1 如何实现链表的逆序
题目:
给定一个带头结点的单链表,请将其逆序,即如果单链表原来为:
head->1->2->3->4->5->6->7,那么逆序后变为
head->7->6->5->4->3->2->1
分析:
逆序可以采用头尾结点交换的方式,
或者采用头插法,每次将当前遍历的结点插入到heat结点后面,
同时记录当前遍历结点的下一个节点。
但是需要记录3个节点。
当前结点,头结点的后1个结点,当前结点的后一个结点
让当前结点指向头结点的后一个结点,然后当当前节点的后1个节点继续重复上述处理。
以结点2为例,记录1,2,3
然后让head指向2,2指向1,然后对结点3处理
head->2->1 3->4->5->6->7
变成
head->3->2->1 4->5->6->7
总结
关键:
1 链表
特点: 每个结点包含元素值和指向下一个结点的信息
单链表: 节点只包含后继结点信息的链表
头结点: 链表的第一个结点
头结点作用:
1) 在任意结点之前插入或者删除某个节点,都只需要修改前一个结点,比无头结点的链表操作简单
2) 对于空链表和非空链表的处理相同
单链表种类: 无头结点单链表,有头结点单链表
注意: python中没有指针的概念,类似指针的功能是通过引用实现德尔
2 解题注意点
注意要将最后一个节点的下一个指针设置为空,否则无限循环
参考:
Python程序员面试算法宝典
'''
class Node(object):
def __init__(self, data=None, nextNode=None):
self.data = data
self.nextNode = nextNode
def buildList(head, arr):
if not arr or not head:
return head
currNode = head
for i, value in enumerate(arr):
newNode = Node(value)
currNode.nextNode = newNode
currNode = newNode
return head
def printList(head):
if not head:
return
node = head.nextNode
while node:
print node.data
node = node.nextNode
def reverseList(head):
if not head:
return head
if head.nextNode is None:
return head
if head.nextNode.nextNode is None:
return head
currNode = head.nextNode.nextNode
nextNode = currNode.nextNode
# 注意要将最后一个节点的下一个指针设置为空,否则无限循环
head.nextNode.nextNode = None
while currNode:
currNode.nextNode = head.nextNode
head.nextNode = currNode
currNode = nextNode
if currNode is not None:
nextNode = currNode.nextNode
else:
nextNode = None
return head
def process():
arr = [i for i in range(1, 8)]
head = Node()
linkList = buildList(head, arr)
# printList(linkList)
head = reverseList(linkList)
printList(head)
arr = [i for i in range(1, 2)]
head = Node()
linkList = buildList(head, arr)
# printList(linkList)
head = reverseList(linkList)
printList(head)
arr = []
head = Node()
linkList = buildList(head, arr)
# printList(linkList)
head = reverseList(linkList)
printList(head)
if __name__ == "__main__":
process()