逆序对测试用例_链表逆序

9617f9e3f6c95943cf61bdd63989d863.png

本文主要讲解链表的逆序,其中针对是否带头结点进行了区分,带头结点的链表逆序包含就地法与插入法两种,不带头结点的为就地法。

带头结点的链表逆序

就地法

以如下的带头结点的链表为例:

76325d10a6f7b9225f508bd8ec8f0177.png
链表

更改节点的指针指向,对于value为1的个节点而言,其后续节点需要置空,value为2的节点需要指向value为1的节点,value为3、4的节点也需要做类似的操作,最终将head节点的指针指向value为4的节点。

代码

class Solution():
    def reverseLinkedList(self,head):
        if head is None or head.next is None:
            return head
        cur = head.next
        suf = cur.next
        cur.next = None
        pre = cur
        cur = suf
        while cur.next is not None:
            suf = cur.next
            cur.next = pre
            pre = cur
            cur = suf
        cur.next = pre
        head.next = cur
        return head
​
solution = Solution()      

创建测试用例

head = LinkedList()
cur = head
for i in range(1,5):
    tmp = LinkedList(i)
    cur.next = tmp
    cur = cur.next
​
# 用于打印链表
def print_linkedlist(r):
    res = [r.val]
    while True:    
        if r.next:
            r = r.next       
        else:
            break
        res.append(r.val)
    print(res)
​
# 打印逆序前的链表
print_linkedlist(head)        
[None, 1, 2, 3, 4]
# 进行逆序
head = solution.reverseLinkedList(head)
# 打印逆序后的链表
print_linkedlist(head) 
[None, 4, 3, 2, 1]

插入法

91e6f77acffa1afe395a0dc4f3754446.png

将value为1的节点的后续节点置空,将value为2的节点指向value为1的节点,将head节点指向value为2的节点;将value为3的节点指向value为2的节点,将head节点指向value为3的节点,后续节点类似。整个逆序过程类似于不断将节点插入到头结点与第一个节点之间,因此称为插入法。

代码

class Solution():
    def reverseLinkedList(self,head):
        if head == None or head.next == None:
            return
        pre = head.next
        cur = head.next.next
        pre.next = None
        while cur is not None:
            suf = cur.next
            cur.next = pre
            head.next = cur
            pre = cur
            cur = suf        
        return head
      
solution = Solution()      

创建测试用例

head = LinkedList()
cur = head
for i in range(1,5):
    tmp = LinkedList(i)
    cur.next = tmp
    cur = cur.next
# 打印逆序前的链表
print_linkedlist(head)
[None, 1, 2, 3, 4]
head = solution.reverseLinkedList(head)
# 打印逆序后的链表
print_linkedlist(head)
[None, 4, 3, 2, 1]

不带头结点的链表逆序

就地法

代码

class Solution():
    def reverseLinkedList(self,first):
        if first is None:
            return first
        pre = first
        cur = first.next
        pre.next = None
        while cur.next is not None:
            suf = cur.next
            cur.next = pre
            pre = cur
            cur = suf
        cur.next = pre  
        return cur      

创建测试用例

first = LinkedList(1)
cur = first
for i in range(2,5):
    tmp = LinkedList(i)
    cur.next = tmp
    cur = cur.next
# 打印逆序前的链表
print_linkedlist(first)    
[1, 2, 3, 4]
# 进行链表逆序
first = solution.reverseLinkedList(first)
# 打印逆序后的链表
print_linkedlist(first)   
[4, 3, 2, 1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值