python 链表中倒数第n个节点 & 翻转链表

剑指offer第22题:

输入一个链表,输出链表中倒数第k个节点

剑指offer第24题:

输入一个链表,翻转它
# _*_ encoding:utf-8 _*_

class ListNode:
    def __init__(self):
        self.value = None
        self.next_node = None


class Solution:
    def list_generate(self, lst):
        """
        传入一个列表将其生成链表
        """
        if not lst:
            # 列表为空
            return False

        node = ListNode()
        node.value = lst[0]
        if len(lst) == 1:
            node.next_node = None
        else:
            node.next_node = self.list_generate(lst[1:])

        return node

    def find_kth_to_tail(self, head_node, k):
        """
        寻找倒数第k个节点
        """
        if not head_node:
            # 头结点为空
            return False

        """
        基本思路:
            维持两个指针:
            一个为目标指针target_node,即指向倒数第k个数。
            另外一个为一直向前遍历的指针node,并且用p_head来记录它是第几个节点
            当指针node指向最后一个节点,即第n个节点且p_head = n 那么倒数第k个节点为 顺序的第n-k+1节点
            所以当p_head==k时,target_node=head_node,当node向前移动时,目标节点也向前移动一位,始终保持着相同距离
            当node指向最后一个节点时,则得到target节点
        """
        p_head = 0
        target_node = None
        node = head_node

        while node:
            p_head += 1      
            if p_head == k:
                target_node = head_node
            elif p_head > k:
                target_node = target_node.next_node

            node = node.next_node
        return target_node      


    def reverse_list(self, head_node):
        """
        翻转链表
        """
        if not head_node:
            return False

        p_pre = None
        p_next = None
        node = head_node
        reverse_head_node = None
        while node:
            if not node.next_node:
                reverse_head_node = node
            p_next = node.next_node
            node.next_node = p_pre
            p_pre = node
            node = p_next
        return reverse_head_node

# 测试用例
if __name__ == '__main__':

    lst_all = [[],[1],[1,2,3],[1,2,3,4],[1,2,3,4,5]]

    for lst in lst_all:

        solution = Solution()

        # 生成链表
        head_node = solution.list_generate(lst)

        # 寻找倒数第n个节点
        # target_node = solution.find_kth_to_tail(head_node, 4)

        # if target_node:
        #   print target_node.value,
        # else:
        #   print target_node,

        # 翻转链表
        reverse_head_node = solution.reverse_list(head_node)

        # 打印翻转的链表
        node = reverse_head_node
        while node:
            print node.value,
            if node.next_node:
                print '->',
            node = node.next_node
        print '\n'






Python中的链表操作包括创建链表、合并链表、删除链表中的元素以及翻转链表中的一段位置的元素。首先,我们可以通过创建一个链表节点类和链表操作类来实现这些操作。链表节点类定义了节点的值和指向下一个节点的指针。链表操作类包含了创建链表、浏览链表等方法。 创建链表操作通过传入一个列表来创建链表。每个列表元素都会被转换为一个节点,并通过指针连接起来。浏览链表操作可以将链表中的元素遍历并返回一个列表。 除此之外,还可以进行一些其他的链表操作,如统计链表中某个元素出现的次数。可以通过调用列表的count()方法来实现。 还可以删除链表倒数第n个元素并返回头结点。这个操作可以通过一次扫描实现。首先,将链表中的每个元素指向一个列表中的每个元素。然后,根据n的值来删除链表中的对应节点。 总之,Python提供了丰富的链表操作方法,可以根据需求进行选择和使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [链表操作基础(python)](https://blog.youkuaiyun.com/beautiful77moon/article/details/120443389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [python链表所有操作详解](https://blog.youkuaiyun.com/starmoth/article/details/88323536)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值