剑指offer-15 反转链表
一、题目描述
输入一个链表,反转链表后,输出新链表的表头。
二、解题步骤
1.解题思路
涉及到链表反转,实现的方式比较多,可以利用指针,也可以使用递归
如果原链表如下:
、
反转之后的链表:
观察可以发现,如果要进行反转链表的话,我们进行的操作是
- 第一个节点的next指针指向空
- 从第二个节点到最后一个节点,把每一个节点的next指针指向前一个节点。
- 把head指针指向最后一个节点
不过这里还有一个细节,我们来看第一步,把第一个节点的next指针指向空,但是指完了以后我们发现出现了问题。现在指向第二个节点6的指针断了。这样的话,之后的节点我们就都找不到了。
所以,在把一个节点的next指针指向其它结点之前,我们要先记录一下它的下一个结点。
2.代码实现
# -*- 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:
return None
Pre = None
Now = pHead
Next = None
while(Now):
#先确定Next的指向,让Next指向后面
Next=Now.next
#转换指向,将本来向后的指向,指向前面
Now.next=Pre
#指针向前移动
#让Pre指向当前
Pre=Now
#让当前的指针指向下一个
Now=Next
pHead=Pre
return pHead
3. 总结
对于链表反转,可以使用两个指针进行辅助,Pre指针指向的是当前节点的前一个节点,Next指针指向的是当前节点的后一个节点。PHead指针赋值给了Now,所有Now指针指向的是当前的节点。要想完成链表反转,首先需要确定当前节点的下一个指向也急就是首先需要将Next的位置确认,Next=Now.next 。如果是先确认当前节点的前一个位置,那在进行赋值时就先确定Pre=Now.next,这样就会使得当前节点与后面的节点断了联系。所有首先需要确定的是Next。下面的工作就是将当前指针移动到下一个,将Pre指针移动到当前指向。