当前位置:网站首页>Algorithem_ ReverseLinkedList
Algorithem_ ReverseLinkedList
2022-04-23 15:54:00 【Mokong 9081】
Given the head of a singly linked list, reverse the list, and return the reversed list.
<!--more-->
Given the head of a singly linked list, reverse the list, and return the reversed list.
Example 1:
Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]
Example 2:
Input: head = [1,2]
Output: [2,1]
Example 3:
Input: head = []
Output: []
Constraints:
The number of nodes in the list is the range 0, 5000.
-5000 <= Node.val <= 5000
Follow up: A linked list can be reversed either iteratively or recursively. Could you implement both?
Solution 1
First of all followup, The most direct solution is , I put LinkNode Converted to an array , Then the array is in reverse order , Regenerate into new LinkNode
The code is as follows :
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func reverseList(_ head: ListNode?) -> ListNode? {
if head == nil || head?.next == nil {
return head
}
var newNode = head
var nodeList: [Int] = []
while newNode != nil {
nodeList.append(newNode!.val)
newNode = newNode?.next
}
var resultNode = ListNode(nodeList[nodeList.count - 1])
var tempNode: ListNode?
for i in 0...nodeList.count - 2 {
let item = nodeList[nodeList.count - 2 - i]
let generateNode = generateNewNode(item)
if tempNode == nil {
resultNode.next = generateNode
}
else {
tempNode?.next = generateNode
}
tempNode = generateNode
}
return resultNode
}
func generateNewNode(_ val: Int) -> ListNode? {
return ListNode(val)
}
}
Solution 2
It's troublesome to understand here , May refer to ,Reverse a linked list, The video at the bottom of the page , Look at it several times. .
Iterative method :
- Declare three pointers ,prev = nil, current = head, next = nil,
- Loop traversal LinkedList
- change next front , First save next, Set up next = current.next
- Then change next, This step is reverse The key to , Set up current.next = prev
- then prev and current Move to the next node , Set up prev = current, current = next
The code is as follows :
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func reverseList(_ head: ListNode?) -> ListNode? {
var mutHead = head
if mutHead == nil || mutHead?.next == nil {
return mutHead
}
// initialize three pointers
// prev as NULL, curr as head, next as NULL
var prev: ListNode?
var curr = head
var next: ListNode?
// iterate through the link list, in the loop do the following
while (curr != nil) {
// Before changing next of current
// store the next node
next = curr?.next
// Now change next of current
// This is where revering happens
curr?.next = prev
// Move the prev and curr one step ahead
prev = curr
curr = next
}
return prev
}
}
Solution 3
The recursive method : A different understanding ,Reverse Linked List
The important thing is to change next Pointer to , Instead of assigning different values
- Declare two ListNode,prev and temp
- prev Used to represent the previous ,temp Represents temporarily stored , add mutHead Current , There are still three ListNode
- loop ,mutHead Not empty ,
- temp = mutHead, hold temp Assign to current
- mutHead = mutHead.next, hold mutHead Assign to the next
- temp.next = prev, hold temp Of next Point to prev, Note that this time temp The value of is current , That is, the current next is prev, The direction of the pointer is reversed
- prev = temp, hold prev The assignment is temp, namely prev Assign to current , Then continue the next traversal , know mutHead Empty stop
The code is as follows :
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func reverseList(_ head: ListNode?) -> ListNode? {
var mutHead = head
if mutHead == nil || mutHead?.next == nil {
return mutHead
}
var prev: ListNode?
var temp: ListNode?
while (mutHead != nil) {
temp = mutHead
mutHead = mutHead?.next
temp?.next = prev
prev = temp
}
return prev
}
}
Method four
The recursive method , Reference resources reclusive reverse linked list,
Mainly need to understand :
Each step of recursion is assigned a value curr.next.next = curr and curr.next = nil Two steps
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func reverseList(_ head: ListNode?) -> ListNode? {
var mutHead = head
if mutHead == nil || mutHead?.next == nil {
return mutHead
}
// recursive
let newHead = reverseList(mutHead?.next)
// The following code should be viewed separately
// mutHead?.next refer to mutHead Next ListNode
// mutHead?.next?.next refer to mutHead Next ListNode Of next Point to
// That's it reverse Point to
mutHead?.next?.next = mutHead
// And then put mutHead?.next namely mutHeead Of next Point to clear
mutHead?.next = nil
return newHead
}
}
版权声明
本文为[Mokong 9081]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204231406039118.html
边栏推荐
猜你喜欢

Groupby use of spark operator

Coalesce and repartition of spark operators

R语言中绘制ROC曲线方法二:pROC包

新动态:SmartMesh和MeshBox的合作新动向

Config组件学习笔记

C, calculation method and source program of bell number

Best practices of Apache APIs IX high availability configuration center based on tidb

Unity Shader学习

Sortby use of spark operator

Cap theorem
随机推荐
ESP32_Arduino
Spark 算子之filter使用
MetaLife与ESTV建立战略合作伙伴关系并任命其首席执行官Eric Yoon为顾问
Go language, condition, loop, function
[self entertainment] construction notes week 2
Codejock Suite Pro v20. three
Upgrade MySQL 5.1 to 5.67
MySQL集群模式與應用場景
utils. Deprecated in35 may be cancelled due to upgrade. What should I do
Neodynamic Barcode Professional for WPF V11.0
R语言中实现作图对象排列的函数总结
Do we media make money now? After reading this article, you will understand
一文掌握vscode远程gdb调试
Large factory technology implementation | industry solution series tutorials
一刷314-剑指 Offer 09. 用两个栈实现队列(e)
为啥禁用外键约束
Deletes the least frequently occurring character in the string
Unity Shader学习
Website pressure measurement tools Apache AB, webbench, Apache jemeter
Spark 算子之distinct使用