正文
思路
以三个节点为切入点,临时变量保存最右边节点,中间节点的指针从指向最右边节点改成指向最左边节点(即翻转),保存最左边节点的变量赋值成中间节点,保存中间节点的变量赋值成最右边节点。
思路扩展
链表翻转也是翻转,联想到普通数值变量的翻转可能会好理解一点,与普通数值变量翻转不同的是不但涉及“值”还设计“指针”,但也没关系,就是多了一步改变指针的状态而已。
// @ts-ignore class ListNode<T> { //链表【节点数据结构】 val: T // 节点的【值】 next: ListNode<T> | null = null // 指向下个节点的【指针】 constructor(val: T) { // 构造函数 this.val = val } } // 翻转节点 const reverseListNode = (head: ListNode<any> | null) => { let left = null // 三个相关节点执行操作时最左边的节点 let mid = head // 三个相关节点执行操作时中间的节点 while (mid !== null) { let right = mid.next //三个相关节点执行操作时最右边的节点,(联想交换a,b两个变量的值时常使用的 tmp 变量,保存状态用的) mid.next = left // 联想交换 a,b 两个变量的值,不过交换 a,b 的值相当于是一维的,只需要改变值,此处相当于是二维的,除了改变值之外,在交换之前需要做值之外的状态(这里的状态就是 next 指向)变更(翻转) left = mid // 联想交换 a,b 两个变量的值 mid = right // 联想交换 a,b 两个变量的值 } } let a = new ListNode(4) let b = new ListNode(5) let c = new ListNode(6) b.next = c a.next = b console.log(a) reverseListNode(a) console.log("result:\n", c)