常见单链表相关问题总结(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))
快速排序






猜你喜欢

转载自blog.csdn.net/baike33/article/details/80941516