【路飞】反转列表的两种实现方式

269 阅读1分钟

一,常规写法

示例 1:

1.先定义一个变量pre = null,再定一个一个变量cur = head 表示未反转的头结点,定义一个变量p表示未反转节点的下一个节点,然后让cur的下一个节点指向pre,再把cur赋值给pre,依次循环就可以实现反转列表了。

具体代码如下:

var reverseList = function(head) {

//判断是否需要反转

if(!head || !head.next) return head;

//定义变量 pre 反转后的头节点,cue 未反转的头结点,p未反转头结点的下一个节点

let pre = null,cur = head,p = head.next;

while(cur) {

//将未反转的第一个节点进行反转

cur.next = pre;

//重置未反转的头结点,反转完毕

pre = cur;

//将未反转的头结点啊赋值给cur进入下一次反转

(cur = p) && (p = p.next);

}

return pre;

};

二.递归实现方法

递归其实就是将一个列表从后往前一次执行,比如数组【1,2,3,4】通过递归输出后就是4,3,2,1

### var reverse = function(list,i){
### i ++
### if(!list[i]) return list[i];
### reverse(list,i)
### console.log(list[i])//4,3,2,1
### }
### reverse([1,2,3,4],-1)
### ```
### ```
### 所以递归实现代码如下:
### var reverseList = function(head) {
### //判断是否需要反转
### if(!head || !head.next) return head
### //tail记录反转的头结点,p等到是的链表的最后一个节点,也就是待反转节点
### let tail = head.next,p = reverseList(head.next);
### //将待反转节点指向空完成反转,此时head等于待反转节点
### head.next = tail.next;
### //将反转节点指向待反转节点
### tail.next = head;
### return p;
### };