持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
前言
链表是一个动态的数据结构,没有扩容的操作;链表的意义在于:从开头Head每个链表都会有一个数据Data,还有一个指针Next它指向另外一个对象,另外一个对象也是这两个对象,往下推--直到最后一个数据只有一个Data,没有指针。
思路
反转每个元素值上都需要两个指针,data和prev,刚开始时,开头只有一个指针data,prev为空指针。
1(
data为当前指针/prev为空指针) -> 2-> 3-> 4 遍历一次之后data指针自动跑到下一个元素上,prev指针移到当前元素上 1(prev为当前指针) -> 2(data为当前指针)-> 3-> 4
互换
经过多次遍历,把每个的指针进行互换,直到prev指向最后一位,data在最后一位的后面,反转后最后一位成为第一位(起点)
1-> 2-> 3-> 4(prev为当前指针)->data指针的位置为空
链表反转
根据传入的head来获取第一位data,由于要反向指针,所以需要把上一个指针进行保存
var data = head;
var prev = null;
根据它进行遍历,如果data不为空,则它们的前后指针进行互换,思路:获取到当前指针指向后,把当前指针赋值为null,把prev记录指针赋值为当前指针
while(data != null){
var next = data.next;
data.next = prev
prev = data
data = prev
}
最后,可以通过对传入head的结构,赋值来优化以上代码
[data.next,prev,data] = [prev,data,data.next]
最后
除了通过while循环方式,进行每次反转,还可以使用递归方式,判断如果当前head和next不为空时,则再次调用并下下位的指针和下一位的指针进行互换,直到head为空
function huhuan(data){
if(data != null){
if(data.next != null){
huhuan(data.next)
data.next.next = head
data.next = null
}
}
}