剑指offer系列15之反转链表

要求

  • 时间限制:1秒
  • 空间限制:32768K
  • 热度指数:394494
  • 本题知识点: 链表

题目描述

输入一个链表,反转链表后,输出新链表的表头。

思路

思路一:辅助空间

该方法需要构造一个辅助数组,不推荐使用。时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)

C++实现
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        ListNode* p = pHead;
        int count = 0;
        while (p){
            count++;
            p = p->next;
        }
        int a[count];
        p = pHead;
        for (int i=count-1; i>=0; i--){
            a[i] = p->val;
            p = p->next;
        }
        p = pHead;
        for (int i=0; i<count; i++){
            p->val = a[i];
            p = p->next;
        }
        return pHead;
    }
};
  • 运行时间:2ms
  • 占用内存:480k
思路二: 头插法实现

每次从旧链表中取出第一个结点插入到新链表的头部。这种方法的时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)

python实现
# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        newHead = ListNode(0)
        
        while pHead:
            # 保存旧链表的头结点
            p = pHead
            pHead = pHead.next
            
            # 将上述保存的头结点插入到新链表的头结点之后
            temp = newHead.next
            newHead.next = p
            newHead.next.next = temp
            
        return newHead.next
  • 运行时间:33ms
  • 占用内存:5864k
C++实现
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        ListNode newHead(0);
        ListNode* temp_old = pHead;
        ListNode* temp_new = &newHead;
        
        while (pHead){
            // 取出旧链表当前的头结点
            temp_old = pHead;
            pHead = pHead->next;
            
            // 将取出的头结点使用头插法插入新链表
            temp_new = newHead.next;
            newHead.next = temp_old;
            newHead.next->next = temp_new;
        }
        return newHead.next;
    }
};
  • 运行时间:4ms
  • 占用内存:472k
思路三:递归法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值