剑指offer试题解读------从尾到头打印链表(python and c++)

剑指offer试题解读------从尾到头打印链表(python and c++)

链表的基本结构

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

一个链表单元由值 val 和索引 next 组成,很多个链表单元组成了一个链表,val是链表单元中的数值,next索引指向下一个链表单元的地址,本质是个指针。

打印一个链表

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
def printlist(node):
    while node:# 判断node是否为空
        print(node.val)
        node = node.next
if __name__ == "__main__":
    # 对链表进行val的赋值和next指针的赋值,其实就是创建了一个链表是1->2->3
    l1 = ListNode(1)
    l2 = ListNode(2)
    l3 = ListNode(3)
    l1.next = l2
    l2.next = l3
    l3.next = None
    # 调用打印函数
    printlist(l1)

输出是1 2 3

题目描述

输入一个链表,按链表从尾到头的顺序返回一个ArrayList

这个题目说白了就是将链表反转一下,分别取出链表的值 插入到list的头部,最后打印输出,其中next是关键

python代码

class Solution:
    # 返回从尾部到头部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        ret = []# 定义一个list来接收数据
        ptemp = listNode
        while ptemp:# 判断链表是否为空
            ret.insert(0,ptemp.val)# 将链表单元的值插入到ret的头部
            ptemp = ptemp.next # 将链表的next指向下一个链表单元,通过这个将链表单元连接了起来
        return ret
        # write code here

下边这个可以在pycharm中运行

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

# 返回从尾部到头部的列表值序列,例如[1,2,3]
def printListFromTailToHead(listNode):
    ret = []# 定义一个list来接收数据
    ptemp = listNode
    while ptemp:# 判断链表是否为空
        ret.insert(0, ptemp.val)# 将链表单元的值插入到ret的头部
        ptemp = ptemp.next # 将链表的next指向下一个链表单元
    return ret
    # write code here
if __name__ == "__main__":
    # 对链表进行val的赋值和next指针的赋值,其实就是创建了一个链表是1->2->3
    l1 = ListNode(1)
    l2 = ListNode(2)
    l3 = ListNode(3)
    l1.next = l2
    l2.next = l3
    l3.next = None
    # 调用打印函数
    print(printListFromTailToHead(l1))

insert函数解析

c++代码

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution 
{
public:
    vector<int> printListFromTailToHead(ListNode* head) 
    {
      vector <int>  result;//定义数组来接收输出
      stack<int> arr;  //建立中间栈
      ListNode* p=head;
      while(p!=NULL)//判断真实的指向是否为空,并且向栈中push数据,先进后出原则
      {
       arr.push(p->val);
       p=p->next;
      }
     int len=arr.size();
     for(int i=0;i<len;i++)
      {//arr头部数据添加到result的尾部,
       result.push_back(arr.top());//将栈中的数据添加到result中,栈是先进后出原则 
       arr.pop();
     }
           return  result;
    }

};

arr头部数据添加到result的尾部,
result.push_back(arr.top())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值