链表 插入 遍历 删除 反转 单向链表 双向链表
206. 反转链表 - 力扣(LeetCode) https://leetcode-cn.com/problems/reverse-linked-list/
class Node:
def __init__(self, val=None):
self.val = val
self.next = None
# 单向链表 反转链表
# doubly linked list
# singly linked list
class SLinkedList:
def __init__(self):
self.head = None
def traverse(self):
node = self.head
while node is not None:
print(node.val)
node = node.next
def reverse(self):
if self.head is None:
return
newHead = None
cur = self.head # 当前节点
while cur is not None:
prior = newHead # 原方向当前节点的前一个节点
after = cur.next # 原方向当前节点的后一个节点
cur.next = prior
newHead = cur
cur = after
self.head = newHead
return
# 解题思路: 找准3个节点
list1 = SLinkedList()
list1.head = Node("H")
e1 = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")
e4 = Node("Thur")
list1.head.next = e1
e1.next = e2
e2.next = e3
e3.next = e4
list1.traverse()
print("ok")
list1.reverse()
list1.traverse()
leetcode的python实现-(206)反转链表和(92)反转链表II https://mp.weixin.qq.com/s/t_R5KUIGcbMiJcjESePr4g
【反转链表1和反转链表2】
leetcode(206)反转链表题目描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
思路
开启一个头节点p1为空的新链表,对已有链表的当前节点head而言,先保存它的下一节点next的指向为temp,然后再对p1和head的next指向修改。最后返回新链表的头节点p1
# Definition for singly-linked list.
from typing import List
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if head == None : return None
p1 = None
while head:
temp = head.next
head.next = p1
p1 = head
head =temp
return p1
测试
if __name__ == "__main__":
n1 = ListNode(1)
n2 = ListNode(2)
n3 = ListNode(3)
n4 = ListNode(4)
n5 = ListNode(5)
m=n1
n1.next=n2
n2.next=n3
n3.next=n4
n4.next=n5
val1 = []
while m:
val1.append(m.val)
m=m.next
print('原链表节点的值:',val1)
#反转链表
s=Solution()
node=s.reverseList(n1)
val2 =[]
while node:
val2.append(node.val)
node=node.next
print('反转后链表节点的值:',val2)
#result
原链表节点的值: [1, 2, 3, 4, 5]
反转后链表节点的值: [5, 4, 3, 2, 1]
leetcode(92)反转链表II
题目描述
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
思路
和上面的反转链表主体类似,关键是找到从那个节点开始反转操作,以及到哪个节点结束反转,最后注意链表节点next指针指向的连续性
class Solution:
def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
p1 = ListNode(1)
p1.next = head
p2 = p1
t = m
while m-1:#找到开始反转的节点m
m = m-1
p2 = p2.next
p3 = p2.next
while n-t:#保证只反转到第n个节点
temp = p3.next
p3.next = temp.next
temp.next= p2.next
p2.next = temp
n = n-1
return p1.next
测试
if __name__ == "__main__":
n1 = ListNode(1)
n2 = ListNode(2)
n3 = ListNode(3)
n4 = ListNode(4)
val1 = []
while m:
val1.append(m.val)
m=m.next
#反转链表
s=Solution()
val2 =[]
while node:
val2.append(node.val)
node=node.next
# result
点击左下角【阅读原文】查看leetcode官网本题描述
【往期文章回顾】
链表
1. 剑指offer的python实现(1)-从尾到头打印链表的值
3. 剑指offer的python实现(15)-链表中倒数第k个结点
4. 剑指offer的python实现(16)-合并两个排序的链表
5. 剑指offer的python实现(18)-删除链表中重复的结点
6. 剑指offer的python实现(20)-链表中的环的入口接点
7. 剑指offer的python实现(23)-两个链表的第一个公共结点
8. 剑指offer的python实现(27)-复杂链表的复制
9. 剑指offer的python实现(29)-二叉搜索树与双向链表
二叉树
2. 剑指offer的python实现(4)-二叉树层级遍历
3. 剑指offer的python实现(5)-二叉搜索树的后序遍历序列
4. 剑指offer的python实现(21)-二叉树的镜像
6. 剑指offer的python实现(25)-二叉树中和为某一值的路径
7. 剑指offer的python实现(30)-二叉树的深度
9. 剑指offer的python实现(38)-二叉树的下一个结点
10. 剑指offer的python实现(39)-对称的二叉树
11. 剑指offer的python实现(40)-二叉搜索树的第k个结点
12. leetcode-二叉树的前、中、后序遍历和层序遍历python实现
13. leetcode-N叉树的前、后序遍历和层序遍历python实现
15. leetcode(235)python实现- 二叉搜索树的最近公共祖先
数组
1. leetcode(560)python实现-和为k的子数组
2. 剑指offer的python实现(46)-构建乘积数组
3. 剑指offer的python实现(35)-把数组排成最小的数
4. 剑指offer的python实现(32)-连续子数组的最大和
5. 剑指offer的python实现(31)-数组中出现次数超过一半的数字
6. 剑指offer的python实现(17)-调整数组奇偶数顺序
7. 剑指offer的python实现(9)-旋转数组的最小数字
字符串
1. 剑指offer的python实现(36)-第一个只出现一次的字符位置
2. 剑指offer的python实现(42)-左旋转字符串
3. 剑指offer的python实现(45)-把字符串转换成整数
栈和队列
1. 剑指offer的python实现(7)-用两个栈实现队列
2. 剑指offer的python实现(8)-栈的压入弹出序列
3. 剑指offer的python实现(28)-包含min函数的栈
递归和循环
1. 剑指offer的python实现(10)-斐波那契数列
排序算法
1. 冒泡排序、选择排序、插入排序、快速排序的python实现
2. 归并排序、堆排序的python实现
(1) 反转链表 - LeetCode 阅读 https://leetcode-cn.com/articles/reverse-linked-list/
双向链表
class Node:
def __init__(self, data):
self.data = data
self.next = None
self.prev = None
class doubly_linked_list:
def __init__(self):
self.head = None
self.next = None
self.prev = None
def push(self, data):
newnode = Node(data)
newnode.next = self.head
if self.head is not None:
self.head.prev = newnode
self.head = newnode
def append(self, data):
newnode = Node(data)
newnode.next = None
lastnode = self.head
while lastnode.next:
lastnode = lastnode.next
newnode.prev = lastnode
lastnode.next = newnode
def print_list(self):
lastnode = self.head
while lastnode.next:
print(lastnode.data)
lastnode = lastnode.next
print(lastnode.data)
dl = doubly_linked_list()
dl.push('Mon')
dl.push('Thu')
dl.push('Wed')
dl.append('a1')
dl.append('a2')
dl.print_list()