题目描述:本题源于leetcode上面试题26
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
思路:
该题有两种效率比较好的解法:
1.头插法:这是一种常见的反转单链表的解法---》先定义一个新的头节点,然后让原始链表从前往后遍历单链表,依次头插到新的链表头。这样就得到了反转后的链表。
2.三引用法:
- 正如该方法的名字,先定义三个节点的引用;分别是:pre、cur、curNext。pre一开始为null,cur指向链表头,curNext指向cur.next;
- 从cur开始循环遍历链表,遍历条件为:cur !=null;每次遍历让cur指向pre,curNext作为临时节点保存cur;
- 返回新节点即可
注意:一开始一定需要让链表头节点指向null,否则链表会形成环,这是本人踩过的坑。
代码:
class Solution {
//方法一:头插法
public ListNode reverseList(ListNode head) {
if(head==null ||head.next==null)
{
return head;
}
ListNode cur=head;
//先定义一个新的头
ListNode newHead=null;
while(cur!=null)
{
ListNode now=cur;
cur=cur.next;
now.next=newHead;
newHead=now;
}
return newHead;
}
}
class Solution {
//方法二:三指针法
public ListNode reverseList(ListNode head) {
if(head==null ||head.next==null)
{
return head;
}
ListNode pre=null;
ListNode cur=head;
ListNode newHead=null;
while(cur!=null)
{
ListNode last=cur.next;
if(last==null)
{
newHead=cur;
}
cur.next=pre;
pre=cur;
cur=last;
}
return newHead;
}
}