编程笔记(二)单链表的反转
单链表
单链表的最大特点是可以将物理地址上不连续的数据连接起来,通过指针来对物理地址进行操作,实现增删改查等功能。
单链表分为两种:有头链表和无头链表。
无头单链表,也就是phead一只是一个指针,指向链表的第一个节点。
带头节点的单链表:只不过头结点的data不保存信息。
Leetcode206 单链表的反转
题目描述:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
使用3个指针遍历单链表逐个反转
使用p和q两个指针配合工作,使得两个节点间的指向反向,同时用r记录剩下的链表。
图解如下:
p = head; p为头节点
q = head->next; q为下一个结点
head->next = NULL;将头节点变为新链表的尾结点
简单分析第一次循环。
r = q->next;
q->next = p;
p = q; p变成q的
q =r; q变为r
依次循环
相关代码如下:
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head==None: # 判断是否为空
return [] # 空则返回【】
p = head
q = head.next
p.next = None # 旧的头指针变为新的尾指针(将头指针指向空)
while(q!=None): # 开始循环直达将q为空
r = q.next
q.next = p
p = q
q = r
head = p # p作为新的头指针
return head
结果如下:
采用单链表的便于插入的性质
从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。
具体过程如图:
如图可知,依次将2-6插入到1节点的后面,最后把1结点放到新链表的最后面。
具体代码如下:
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
"""
p, rev = head, None
while p:
rev, rev.next, p = p, rev, p.next
return rev
"""
if head==None:
return []
else:
if head.next==None:
return head
else:
p = head.next
while(p.next!=None):
q = p.next
p.next = q.next
q.next = head.next
head.next = q
p.next = head
head = p.next.next
p.next.next = None
return head
提交结果:
至于迭代或递归地反转链表以及其它方法,有待研究。
参考文章:https://www.cnblogs.com/mafeng/p/7149980.html