反转一个单链表
题意:反转一个单链表。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
思路
需要虚拟节点么?
答:不需要,因为没有删除节点,只是改变了节点的指向。
遍历之后,如果找到之前的节点?
答:双指针。我们利用双指针来标识前一个节点。
首先我们为什么需要前一个节点?
答:因为当前节点的下一个节点需要指向前一个节点。所以需要下一个节点。
给兄弟们上一个动图,就明白一切了。
代码
//class ListNode{
// private int val;
// private ListNode next;
// ListNode(int val){
// this.val = val;
// }
// ListNode(int val,ListNode next){
// this.val = val;
// this.next = next;
// }
//}
public class reverseTreeTest {
//1. 双指针法
public ListNode reverserTree(ListNode head) {
ListNode prev = null;
ListNode cur = head;
ListNode temp;
while (cur != null) {
//步骤一:记录下下一个节点
temp = cur.next;
//步骤二:当前节点指向前一个节点
cur.next = prev;
//步骤三:之前的节点变成cur节点(因为1->null 之后,当遍历2的时候,需要 2->prev(1->null),如果这里不赋值,会变成2->null)
prev = cur;
//步骤四:当前节点变成下一个节点
cur = temp;
}
return prev;
}
}
总结
双指针法在解决链表的时候,是一种常见的算法。比如后面的链表中寻找环,也是利用双指针(快慢指针)相遇来判断是否有环。
这个题目,唯一需要注意的是:虽然只有4行代码。但是你得理解每行代码的意义。实在不行,自己手动画一画,也就理解了。如果还是理解不了,先记着吧,后面熟能生巧。嘻嘻。