1.题目
剑指 Offer 24. 反转链表
难度简单
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
2.解题方法
1.简历虚拟头结点辅助反转
可以先建立一个虚拟节点ans,这样可以很好的简化我们的操作。只需要遍历链表将每个节点拆下来,插入到ans后就可以实现反转
public ListNode reverseList(ListNode head) {
ListNode ans = new ListNode(-1);
ListNode curr = head;
while (curr != null) {
//存储下一个节点
ListNode next = curr.next;
//插入到新链表中
curr.next = ans.next;
ans.next = curr;
//指向下一个节点
curr = next;
}
return ans.next;
}
2.使用双指针
链表的反转实际上也就是指向的反转
定义2个指针pre和curr,curr指向当前节点pre指向前一个节点,让这两个节点的指向改变
public ListNode reverseList2(ListNode head) {
ListNode pre = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
return pre;
}