class ListNode {
val: number
next: ListNode | null
constructor(val?: number, next?: ListNode | null) {
this.val = (val === undefined ? 0 : val)
this.next = (next === undefined ? null : next)
}
}
// 方法1:使用栈结构
function reverseList(head:ListNode|null){
//设置边界条件
if(!head||!head.next) return head
方法一:使用栈结构反转链表
let arr:ListNode[]=arr
while(head){
arr.push(head)
head = head.next
}
let newNode = arr.pop()! // 初始化newNode
let current = newNode // 存储当前节点
while(arr.length){
current.next = arr.pop() // 让当前的节点 指向数组列表中的 倒数第二个节点
current = current.next // 取出倒数第二个节点 继续循环 直到列表的长度为0
}
// 但是这里要注意 当取到第一个节点的时候 要将第一个节点的next 指向null 这样就不会形成一个闭环
current.next = null
return newNode
}
// 方法二:使用循环
function reverseList(head:ListNode|null){
//设置边界条件
if(!head||!head.next) return head
方法一:使用栈结构反转链表
let newNode = null // 初始化一个链表 让他一开始指向null
let current = head //存储当前的节点
while(head){
current = head.next //存储当前的节点
head.next = newNode // 当当前节点的next 指向newNode
newNode = head // 改变newNode的指向 指向head 为了让下一次再去指向这个节点
head = current // 给head重新赋值 再取出这个节点
}
return newNode
}
// 方法三:使用递归 取出倒数第二个节点 ;从而拿到最后一个节点 修改最后一个节点的指向 指向倒数第二个节点;让倒数第二个节点 指向null ;缩短了原来的链表
function reverseList(head:ListNode|null){
//设置边界条件
if(!head||!head.next) return head
let newNode = reverseList(head.next)
head.next.next=head
head.next = null
return newNode
}
let node = new ListNode(1)
node.next = new ListNode(2)
node.next.next = new ListNode(3)
node.next.next.next = new ListNode(4)
let newNode = reverseList(node)
// 打印操作后的链表的值
let arr: number[] = []
let newnode: ListNode | null = newNode
while (newnode) {
arr.push(newnode.val)
newnode = newnode.next
}
console.log(arr);