一,常规写法
示例 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;
### };