剑指offer 15、反转链表 python c++

题目描述:

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

思路:看代码注释,讲的应该还算清楚。主要做法就是从前往后,每次用到三个节点,1、原始的第一个节点p1(整个过程中始终不变),2、本次要放到最前面的节点p2,3、下一次要放到最前面的节点p3(其实就是p2.next),

每次完成一个节点的倒序,举个例子原来是 1 2 3 4 5 ,第一次结束后变成 2 1 3 4 5 ,再一次变成 3 2 1 4 5

那么其实我们就有一个大概的步骤了:

1、把1的下一个指向3, 含义是把第一个节点的next指向 下一次要放到最前面的节点p3
2、把2的下一个指向1,含义是把本次要放到最前面的节点p2的next指向上一次变化后的最开始节点
3、把第一个变成2,含义是把本次要放到最前面的节点p2放到最开始

我们再来模拟一下第二次变化的过程:

1、把第一个节点的next指向 下一次要放到最前面的节点p3 , 就是把1(第一个节点)的下一个指向4( 下一次要放到最前面的节点)
2、把本次要放到最前面的节点p2的next指向原来的最开始节点,把3(本次要放到最前面的节点)的下一个指向2(上一次变化后的最开始节点)
3、把本次要放到最前面的节点p2放到最开始,即把3(本次要放到最前面的节点)放到最开始

3—>2—>1—>4—>5红色的是我们改变的指向关系,3是我们本次要放到最前面的节点

接着循环,4 3 2 1 55 4 3 2 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
        if pHead == None or pHead.next == None:   #排除没有元素和只有一个元素
            return pHead
       #python里面居然head就是第一个节点,见鬼了
        p1 = pHead   #代表原始的第一个节点
        p2 = p1.next    #代表要放到最前面(head后面)的节点
        p3 = None   #这儿不等于p2.next是因为怕只有两个元素 ,它的含义是代表下一个放到最前面(head后面)的节点,
        while p2 != None:
            p3 = p2.next   #找到下一个放到最前面的节点,
            p1.next = p3   #第一个节点的后续节点指向下一个要放到最前面节点p3
            p2.next = pHead    #本次要节点p2放到最前面,那么原来的最前面就变成本次要放到最前面节点p2的后续节点
            pHead = p2   #头结点的后续节点指向本次要放到最前面节点p2
             # 这样一来,p3前面的节点都是倒序了的
            p2 = p3  #然后把p3赋值给p2,进行下一次循环
        return pHead

c++版

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead == nullptr || pHead->next == nullptr){
            return pHead;
        }
        ListNode *p1 = pHead;
        ListNode *p2 = p1->next;
        ListNode *p3 = nullptr;
        while(p2 != nullptr){
            p3 = p2->next;
            p1->next = p3;
            p2->next = pHead;
            pHead = p2;
            p2 = p3;
        }
        return pHead;
    }
};

c++ 版翻车版

翻车原因,这次的链表是没有头结点的。牛客网就是这个比较烦,不说清楚。

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead->next == nullptr || pHead->next->next == nullptr){
            return pHead;
        }
        ListNode *p1 = pHead->next;
        ListNode *p2 = p1->next;
        ListNode *p3 = nullptr;
        while(p2 != nullptr){
            p3 = p2->next;
            p1->next = p3;
            p2->next = pHead->next;
            pHead->next = p2;
            p2 = p3;
        }
        return pHead;
    }
};
posted on 2021-06-10 17:29  雾恋过往  阅读(31)  评论(0编辑  收藏  举报

Live2D