剑指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))
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())