编程笔记(二)单链表的反转

单链表

单链表的最大特点是可以将物理地址上不连续的数据连接起来,通过指针来对物理地址进行操作,实现增删改查等功能。
单链表分为两种:有头链表和无头链表。
无头单链表,也就是phead一只是一个指针,指向链表的第一个节点。

在这里插入图片描述

带头节点的单链表:只不过头结点的data不保存信息。

在这里插入图片描述

单链表深入理解可以参考相关文章

Leetcode206 单链表的反转

题目描述:
反转一个单链表。

示例:

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

使用3个指针遍历单链表逐个反转

使用p和q两个指针配合工作,使得两个节点间的指向反向,同时用r记录剩下的链表。

图解如下:
p = head; p为头节点
q = head->next; q为下一个结点

在这里插入图片描述

head->next = NULL;将头节点变为新链表的尾结点
在这里插入图片描述

简单分析第一次循环。
r = q->next;
q->next = p;
在这里插入图片描述

p = q; p变成q的
q =r; q变为r
在这里插入图片描述
依次循环

相关代码如下:

class Solution:
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """      
        if head==None:  # 判断是否为空 
             return []  # 空则返回【】
        p = head      
        q = head.next
        p.next = None   # 旧的头指针变为新的尾指针(将头指针指向空)
        while(q!=None): # 开始循环直达将q为空
            r = q.next
            q.next = p
            p = q
            q = r
        head = p        # p作为新的头指针
        return head

结果如下:
在这里插入图片描述

采用单链表的便于插入的性质

从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。

具体过程如图:
在这里插入图片描述
如图可知,依次将2-6插入到1节点的后面,最后把1结点放到新链表的最后面。

具体代码如下:

class Solution:
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        """
        p, rev = head, None
        while p:
            rev, rev.next, p = p, rev, p.next
        return rev
        """
        if head==None:
            return []
        else:
            if head.next==None:
                return head
            else:
                p = head.next
                while(p.next!=None):
                    q = p.next
                    p.next = q.next
                    q.next = head.next
                    head.next = q
                p.next = head
                head = p.next.next
                p.next.next = None
                return head

提交结果:
在这里插入图片描述

至于迭代或递归地反转链表以及其它方法,有待研究。
参考文章:https://www.cnblogs.com/mafeng/p/7149980.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值