链表反转
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.*;
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode cur= head;
ListNode pre = null;
if(head==null)
return null;
while(cur!=null){
ListNode tem = cur.next;
cur.next = pre;
pre = cur;
cur = tem;
}
return pre;
}
}
链表反转详解:
链表是单链表,只可以指向后面的节点,遍历也只可以向后。
所以需要new一个新的ListNode用来存储反转后的链表。pre
然后还需要一个临时ListNode来存储临时存储当前节点指向的节点。(这里must,因为下一步会把当前节点的下一个指针变更,要是没有这一步,下一步执行了,当前节点的.next就丢失了。)
然后把当前节点的下一个指针指向已经反转后的节点,(这里也是must,也是核心,当前节点的下一个节点=(赋值符号)之前已经反转的节点,执行完这一步当前节点指向的链表都是反转之后)
然后当前节点所带领的链表就是反转后的链表。赋值给pre(把反转之后的链表再次赋值给存储反转之后的链表pre)
然后把临时表指向的当前链表的后一个指针赋值给当前链表,继续循环。(这里取刚才第一步临时链表存储的当前节点的下一个节点)。
总结:设计到链表的问题,总会需要一个临时表来存储当前节点的下一个节点,然后再对此节点进行操作。