LeetCode Notes_#206 Reverse Linked List(C++,Python)

LeetCode Notes_#206 Reverse Linked List(C++,Python)

Contents

题目

Reverse a singly linked list.

Example:

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL

思路

思考

  • 为什么要使用两个指针?

    • 因为每次进行逆转操作必然涉及到两个节点,head(后)->next = new_head(前),所以必然是两个指针
    • 两个指针指向的就是当前操作到的两个相邻的节点,另一个角度来说,也可以看做
      1. 正在被拆分的原链表的头,命名为head;
      2. 正在被构造的新链表的头,命名为new_head;新链表往前延伸(这也有点和惯常思维不一样),好像一个栈,从顶部加入新元素,先加入的反而排在后面
    • 严格来说是三个,为了不断遍历,一开始还需要把head->next备份下来。正是由于指针有点多,所以很容易糊涂。要时刻明确每一个指针存在的意义。
  • 写循环的思路?

    • 循环条件是什么?
      • 遍历到链表的最后
    • 循环体是什么?
      • 先考虑中间的情况(普遍),再去考虑头和尾的情况(特殊)
    • 用哪一种循环(for还是while?)
      • 因为不确定循环次数,所以是while

每次循环的操作
每次循环的操作

  • 关于链表的头指针?
    • 头指针直接指向第一个存储数据的节点
    • 为什么这题里边new_head初始化为Null?
      • 其实并没有被用到,因为第一次进入循环就赋值为new_head = head
      • 初始化为Null只是因为必须初始化.
      • 第一次用到了,其实是作为新链表的最后一个节点
      • C++ 不要忘记指针变量的初始化

解答

C++

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* new_head = NULL;
        while(head){
            ListNode* next = head->next;
            head->next = new_head;
            new_head = head;
            head = next;
        }
        return new_head;
        
    }
};

Python

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        new_head = None
        while(head):
            next = head.next
            head.next = new_head
            new_head = head
            head = next
        return new_head

转载于:https://www.cnblogs.com/Howfars/p/10251719.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值