总结了一些链表中常见的问题,供以后翻阅。
首先定义单个结点
# 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))