当前位置:网站首页>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
边栏推荐
- Single architecture system re architecture
- C language --- string + memory function
- 王启亨谈Web3.0与价值互联网“通证交换”
- Filter usage of spark operator
- Go语言条件,循环,函数
- Neodynamic Barcode Professional for WPF V11. 0
- 糖尿病眼底病变综述概要记录
- Application of Bloom filter in 100 million flow e-commerce system
- Why is IP direct connection prohibited in large-scale Internet
- 5 minutes, turn your excel into an online database, the magic cube net table Excel database
猜你喜欢
随机推荐
New developments: new trends in cooperation between smartmesh and meshbox
Tencent offer has been taken. Don't miss the 99 algorithm high-frequency interview questions. 80% of them are lost in the algorithm
Simple usage of dlopen / dlsym / dlclose
建设星际计算网络的愿景
shell_ two
shell脚本中的DATE日期计算
VIM specifies the line comment and reconciliation comment
MySQL Cluster Mode and application scenario
多生成树MSTP的配置
Application case of GPS Beidou high precision satellite time synchronization system
一刷314-剑指 Offer 09. 用两个栈实现队列(e)
Spark 算子之filter使用
Large factory technology implementation | industry solution series tutorials
[AI weekly] NVIDIA designs chips with AI; The imperfect transformer needs to overcome the theoretical defect of self attention
Leetcode-374 guess the size of the number
C#,贝尔数(Bell Number)的计算方法与源程序
Distinct use of spark operator
Config learning notes component
IronPDF for .NET 2022.4.5455
Spark 算子之distinct使用