Python程序员面试算法宝典---解题总结: 第1章 链表 1.1 如何实现链表的逆序

#!/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()

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值