题目:https://leetcode-cn.com/problems/reverse-linked-list/
题意:反转一个单链表。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
解题和理解方法:画图画图画图!
1.方法1-新建一个链表,进行添加操作
- 先定义新节点 reverseHead = new ListNode(0)
- 从头遍历原来的链表,每遍历一个节点,就将其取出,并放在新链表的最前端。
- 定义一个follow 用于存temp.next的。因为当我们完成插入后,temp.next指向的就不是原来的下一个节点,所以我们要对其进行保存,方便在下一次循环操作。
这里需要注意一下,题目中给的head里有数据,而我定义的reverseHead 是没有数据的,也就是0,所以我们最终return reverseHead.next
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null){
return null;
}
//逆转的头节点
ListNode reverseHead = new ListNode(0,null);
//辅助指针,帮助遍历
ListNode temp = head;
//用于存放temp节点的next节点
ListNode follow = null;
// 遍历原来的链表,每遍历一个节点,将其取出,放在reserveHead的最前端
while(temp!=null){
// 先暂时保存当前节点的下一个节点,方便后面使用
follow = temp.next;
// 将temp的下一个节点指向新链表的最前端
temp.next = reverseHead.next;
// 将temp插入到新链表的最前端
reverseHead.next = temp;
// 然后temp后移
temp = follow;
}
return reverseHead.next;
}
}
2.双指针法
在学会了第一个方法后,双指针可以说是手到擒来。
一样的用temp存后面的节点,一样指向方式。
唯一需要注意的是return部分,因为 循环里必须有cur = temp;而我们最终的停止是temp!=null(你也可以写成cur != null),意味着temp指向null时,pre便是链表的头节点。所以我们返回pre。
public ListNode reverseList(ListNode head) {
if(head==null){
return null;
}
ListNode pre = null;
ListNode cur = head;
ListNode temp = head;
while(temp!=null){
//先保存
temp = cur.next;
//变向
cur.next = pre;
//pre,cur往后移
pre = cur;
cur = temp;
}
return pre;
}