LSGO——LeetCode实战(链表系列):237题 反转链表(Reverse Linked List)

原题:

 

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

解法一(迭代):

本来想写递归的,结果写着写着程序变成了迭代。

思路:首先我们看到反转链表,最后其实就是将箭头方向变换为反方向。也就是说原理的尾节点变成了首节点。由於单链表无法向前搜索,所以我们先创建一个辅助链表。本程序我把head作为了辅助链表,将原链表赋给pro。pro指向的是我们即将变换的节点。

接下来一步就是变换next,我们假设head是前m个节点且已经反转完毕的链表,我用pro记录还未反转的链表,之后我用ans先记录刚刚pro位置,pro继续向后遍历。将已经反转的链表表头head赋给ans.next。ans再赋给head,完成一个新的反转完毕的链表,此时,前pro个节点反转完毕。

最后,当剩余最后一个还未反转(一个节点无需反转),直接将这个节点连接上head。此时整个链表反转完毕。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head:
            pro = head.next
            if pro == None:
                return head
            head.next = None
        else:
            return head
        while pro.next != None:
            ans = pro
            pro = pro.next
            ans.next  = head
            head = ans
        pro.next =head
        return pro

解法二(递归法):

我一开始没有写对,递归法只写对了一点,对链表的认识可能还是有点欠缺(手动狗头)。

递归,我唯一的感悟就是把self.reverseList(head.next)看做一个已经反转完成的链表(也就是说递归函数就是我们已经完成的操作结果),之后代入这个操作结果去完成其他的数据处理。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head == None or head.next is None:
            return head
        p = self.reverseList(head.next);
        head.next.next = head
        head.next = None
        return p

            
            
        
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章