剑指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 5
,5 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;
}
};