JS 206. Reverse Linked List(反转单链表)

Reverse a singly linked list.

思路1:迭代方法。

在原链表之前建立一个dummy node,因为首节点会变。然后从head开始遍历,将之后的一个节点移到dummynode节点之后,重复此操作直到head成为末节点为止。
例如:

1->2->3->4->5
dummy->1->2->3->4->5//cur是1,tmp是cur.next(2)
dummy->2->1->3->4->5//cur是1,tmp是3
dummy->3->2->1->4->5
var reverseList = function(head) {
  if(!head) return head;
    var dummy=new ListNode(-1);
    dummy.next=head;
    var cur=head;
    while(cur.next){
        var tmp=cur.next;
        cur.next=tmp.next;
        tmp.next=dummy.next;
        dummy.next=tmp;
    }
    return dummy.next;   
};

思路2:递归方法:

不断的进入递归函数,直到head指向最后一个节点,p指向前一个节点,然后调换head和p的位置。再返回上一层递归函数,再交换p和head(整个head)的位置,head节点后都是交换好的顺序,直到p为首节点,再交换,首节点就成为了末节点,此时整个链表也完成了翻转

例如:反转12345
    p=1,head=                             return 54321
          |
        p=2 head=
             |
          p=3 head=54                       return 543
              |                                           |
            p=4 head=reverseList(5) return 54
        
var reverseList = function(head) { 
    //递归方法
    if( !head || !head.next) return head;
    var p=head;
    head=reverseList(p.next);
    p.next.next=p;//由于之前p.next现在到了head的最后一个,所以p.next.next就完成和p和head交换顺序的任务,将p放到了head最后边。
    p.next=null;
    return head;
};

你可能感兴趣的:(JS 206. Reverse Linked List(反转单链表))