反转链表

反转链表

题目描述
输入一个链表,反转链表后,输出新链表的表头.
输入{1,2,3}
输出{3,2,1}
思路解析
要反转链表,就要将原始链表的头结点变为反转后链表的尾结点,即next结点指向None,原始链表的其余所有结点包括尾结点均改变结点的next指向,将结点的next指向反转为指向原始结点的前一个结点元素。
1.非递归求解——迭代法
首先要考虑到输入链表为空和只有一个结点的情况,这两种情况是不需要反转的,直接返回空值或者原始值。
代码实现如下:

if pHead == None:
	return None
if pHead.next == None:
	return pHead

其次是进行链表反转的操作,需要定义三个指针分别指向当前待反转链表的前三个元素left,mid,right:头结点pHead,头结点的next结点pHead.next,和头结点的next的next结点pHead.next.next。

left = pHead
mid = pHead.next
right = mid.next

待反转链表的头结点的next指向空,即None,实现了头结点变换为尾结点。

left.next = None

循环条件控制:当right.next不为空时,证明待反转链表中元素仍然存在,循环执行反转操作。
循环执行反转操作:将mid的next指向left,完成了一次反转,一次反转执行结束后需要调整三个指针的位置,让其一次向右移动,即left移到mid的位置,mid移到right的位置,right移到它next的位置。

mid.next = left
left = mid
mid = right
right = right.next

当right为None时,证明整个链表循环结束,mid指向了链表中的最后一个元素,此时跳出循环,跳出循环后将最后一个元素,即当前mid所指向的结点进行反转,即当前最后一个结点的next指向前一个结点。最后返回所有反转的结点值。

mid.next = lef
return mid

完整代码

class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        #1.将现有的头结点换为尾,尾部的next为空
        #2.从第2个node开始,循环将next指向前一个
        #3.需要一直有一个指针指向还没有反转的链表头部

        #排除掉两种不用反转链表的情况:首先判断传入列表为空和传入链表只有一个元素的情况
        if pHead == None:
            #如果头结点为None,即是空链表,直接返回空值
            return None
        if pHead.next == None:
            #如果是头结点的next结点为空。说明只有头结点一个结点,直接返回头结点
            return pHead

        #需要进行反转的情况
        #定义三个指针,分别指向待反转的链表的头结点pHead,
        leftPointer = pHead
        # 头结点的下一结点pHead.next
        midPointer = pHead.next
        # 头结点的下下一结点pHead.next.next
        rightPointer = midPointer.next

        #将原始链表的头结点指向None,即作为新链表的尾部
        leftPointer.next = None
        # 只要最右的指针不为空说明待反转的链表仍然有值
        while rightPointer != None:  # 循环内始终反转一个指向
            # 开始调转指向
            # 将mid的next结点指向left结点,反转指针,断开原始指向
            midPointer.next = leftPointer
            # 依次将三个指针向右移动
            # 左指针移到中间指针的位置
            leftPointer = midPointer
            # 中间指针移动到右指针的位置
            midPointer = rightPointer
            # 右指针移动到原始右指针所指的下一个位置,即右指针的next元素所在的位置
            rightPointer = rightPointer.next
        # ***所有循环结束后,最后一个元素的指向进行反转***
        midPointer.next = leftPointer
        # *****返回值
        return midPointer

2.递归求解
按照递归的思想,大问题划分为小问题,然后合并。每一次都是对待反转链表中的第一个结点进行反转操作,即变化结点的next指向。

class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
		if not pHead:
		            return None
		        if not pHead.next:
		            return pHead
		headNode = self.ReverseList(pHead.next)
		pHead.next.next = pHead
		pHead = None
		return headNode

你可能感兴趣的:(数据结构,算法,python)