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;
};