常见单链表相关问题总结(Python)

总结了一些链表中常见的问题,供以后翻阅。

首先定义单个结点

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

1.反转单链表

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

非递归:

def reverseLinklist(head):
    pre=None
    while head:
        cur=head
        head=head.next
        cur.next=pre
        pre=cur
    return pre

递归:

class reverse(object):
    def reverseList(self, head):
        return self._reverse(head)

    def _reverse(self, node, prev=None):
        if not node:
            return prev
        n = node.next
        node.next = prev
        return self._reverse(n, node)

2.从尾到头打印单链表

非递归解法,借助一个栈来完成,代码很简单。

def Tail2Head(head):
    stack=[]
    while head:
        stack.append(head)
        head=head.next
    while stack:
        print stack.pop().val

递归解法,代码更简单。但个人感觉思路上没有非递归解法直观。先递归到最后一个结点,依次往前打印。

def recursive_Tail2Head(head):
    if not head:
        return
    recursive_Tail2Head(head.next)
    print head.val

3.删除单链表中的指定结点(非尾结点)

def DeleteNode(node):
    node.val = node.next.val
    node.next = node.next.next

4.在指定结点前插入一个结点

思路:在指定结点后插入新结点,再交换两结点的值。

def addNode(node,val):
    newnode=ListNode(val)
    temp=node.next
    node.next=newnode
    newnode.next=temp
    node.val,newnode.val=newnode.val,node.val

5.链表排序

归并排序

原理不再赘述,代码如下。

def merge(l1, l2):
    if l1 is None:
        return l2
    if l2 is None:
        return l1
    if l1.val <= l2.val:
        l1.next = merge(l1.next, l2)
        return l1
    else:
        l2.next = merge(l1, l2.next)
        return l2

def sortList(head):
    # write your code here
    if head is None or head.next is None:
        return head
    pre = head
    slow = head
    fast = head
    while fast is not None and fast.next is not None:
        pre = slow
        slow = slow.next
        fast = fast.next.next
    pre.next = None
    return merge(sortList(head), sortList(slow))
快速排序






  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值