@剑指offer(Python)反转链表

剑指offer刷题笔记15(Python)

题目描述

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

思路1

递归

代码1

# -*- 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
        if pHead.next == None:   # 考虑链表只有一个节点
            return pHead
        temp = pHead.next
        res = self.ReverseList(pHead.next)   # 对pHead以后的链表进行翻转,res表示反转之后的头结点
        pHead.next = None   # 将头结点的next设置为None
        temp.next = pHead     # 将头结点的下一节点的next设置为pHead,表示反转
        return res   # 返回头结点

思路2

非递归,利用循环。对每个节点,都需要进行next节点的反转工作。例如:
1->2->3->4->5,遍历链表,把1的next置为None,2的next置为1,以此类推,5的next置为4。代码如下:

# -*- 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
        if pHead.next == None:
            return pHead
        newhead = None   # 构建一个newhead,并不断更新newhead,直到遍历完链表,这时候的链表就是反转之后的头结点
        cur = pHead
        while cur:       # 这个循环是重点
            temp = cur.next
            cur.next = newhead  # 让后一节点的next节点等于当前的头结点
            newhead = cur
            cur = temp
        return newhead

你可能感兴趣的:(剑指offer(python))