本文主要讲解链表的逆序,其中针对是否带头结点进行了区分,带头结点的链表逆序包含就地法与插入法两种,不带头结点的为就地法。
带头结点的链表逆序
就地法
以如下的带头结点的链表为例:
更改节点的指针指向,对于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]
插入法
将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]