反转单向和双向链表

题目:
1.反转单链表
SListNode

class SListNode():
    def __init__(self, val):
        self.val = val
        self.next = None

反转

def reverse_slist(head):
    prev = None
    cur = head
    while cur:
        next = cur.next
        cur.next = prev
        prev = cur
        cur = next

    return prev

测试

def dump_slist(head):
    l = []
    cur = head
    while cur:
        l.append(cur.val)
        cur = cur.next

    return l

def test_reverse_slist(count):
    l = []
    for i in range(count):
        l.append(i)

    head, tail = None, None
    for v in l:
        node = SListNode(v)
        if not tail:
            head = node
        else:
            tail.next = node
        tail = node

    print('org data:', l)

    l1 = dump_slist(head)
    print('slist:   ', l1)

    head = reverse_slist(head)
    l1 = dump_slist(head)
    print('reversed:', l1)
    print('-------------------------------------------------')

2.反转双链表
DListNode

class DListNode():
    def __init__(self, val):
        self.val = val
        self.next = None
        self.prev = None

反转
简单修改反转单链表的代码:

def reverse_dlist(head):
    prev = None
    cur = head
    while cur:
        next = cur.next
        cur.next = prev
        if prev:
            prev.prev = cur
        prev = cur
        cur = next

    if prev:
        prev.prev = None
    return prev

书中代码更简洁

def reverse_dlist2(head):
    pre, cur = None, head
    while cur:
        next = cur.next
        cur.next = pre
        cur.prev = next
        pre = cur
        cur = next
    return pre

测试

def dump_dlist(head):
    l = []
    cur = head
    while cur:
        l.append(cur.val)
        cur = cur.next

    return l


def dump_dlist_reverse(head):
    tail = head
    while tail and tail.next:
        tail = tail.next

    l = []
    cur = tail
    while cur:
        l.append(cur.val)
        cur = cur.prev

    return l


def test_reverse_dlist(count):
    l = []
    for i in range(count):
        l.append(i)

    head, tail = None, None
    for v in l:
        node = DListNode(v)
        if not tail:
            head = node
        else:
            tail.next = node
            node.prev = tail
        tail = node

    l1 = dump_dlist(head)
    print('dlist:          ', l1)

    l1 = dump_dlist_reverse(head)
    print('reverse print:  ', l1)

    head = reverse_dlist(head)
    l1 = dump_dlist(head)
    print('reversed dlist: ', l1)
    l1 = dump_dlist_reverse(head)
    print('reverse print:  ', l1)

    head = reverse_dlist2(head)
    l1 = dump_dlist(head)
    print('reversed dlist2:', l1)
    l1 = dump_dlist_reverse(head)
    print('reverse print:  ', l1)
    print('-------------------------------------------------')

if __name__ == '__main__':
    test_reverse_slist(0)
    test_reverse_slist(1)
    test_reverse_slist(2)
    test_reverse_slist(3)
    test_reverse_slist(10)

    test_reverse_dlist(0)
    test_reverse_dlist(1)
    test_reverse_dlist(2)
    test_reverse_dlist(3)
    test_reverse_dlist(10)

结果:

➜  4_reverse_linklist python reverse_linklist.py
org data: []
slist:    []
reversed: []
-------------------------------------------------
org data: [0]
slist:    [0]
reversed: [0]
-------------------------------------------------
org data: [0, 1]
slist:    [0, 1]
reversed: [1, 0]
-------------------------------------------------
org data: [0, 1, 2]
slist:    [0, 1, 2]
reversed: [2, 1, 0]
-------------------------------------------------
org data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
slist:    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
reversed: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
-------------------------------------------------
dlist:           []
reverse print:   []
reversed dlist:  []
reverse print:   []
reversed dlist2: []
reverse print:   []
-------------------------------------------------
dlist:           [0]
reverse print:   [0]
reversed dlist:  [0]
reverse print:   [0]
reversed dlist2: [0]
reverse print:   [0]
-------------------------------------------------
dlist:           [0, 1]
reverse print:   [1, 0]
reversed dlist:  [1, 0]
reverse print:   [0, 1]
reversed dlist2: [0, 1]
reverse print:   [1, 0]
-------------------------------------------------
dlist:           [0, 1, 2]
reverse print:   [2, 1, 0]
reversed dlist:  [2, 1, 0]
reverse print:   [0, 1, 2]
reversed dlist2: [0, 1, 2]
reverse print:   [2, 1, 0]
-------------------------------------------------
dlist:           [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
reverse print:   [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
reversed dlist:  [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
reverse print:   [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
reversed dlist2: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
reverse print:   [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
-------------------------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值