题目:反转链表
注:一千个人心理有一千个哈姆雷特。哪怕思路一致,1000个人可能写出的代码都会有1000种形式,在此我只是分享下思路,至于代码实现,各位看客参考即可,如果有更好的思路,欢迎在评论区指出~~~感谢各位~
问题描述:
输入一个链表,反转链表后,输出新链表的表头。
输入:
{1,2,3}
返回值:
{3,2,1}
问题分析:
遇到反转链表的问题,我们一般使用遍历反转即可解决此类问题。例如,如果给定元素是{1,2,3},我们进行遍历的时候,记两个值,一个是pre(前一个值),一个是cur(遍历当前位置的值)。在操作前,指针指向是pre->cur,我们在操作后,会变成cur->pre。也就是说我们会把{1->2->3}操作后变成{1<-2<-3}。
所以,我们只要每次都能确保获取到准确的pre和cur值,就可以完成这个过程。
1)遍历到1的时候,我们不操作。因为cur=1,但是pre 是不存在,因为1是最前面的。此时我们手动赋值,pre =1。赋值之后,为了避免元素1的next影响我们后续指针变化,所以这里要执行pre.next = null
2)遍历到2的时候,pre =1,cur = 2 ;首先要保留2的下一个,否则在cur.next = pre之后,我们就无法遍历到元素3了。temp= cur.next ; cur.next = pre; pre = cur; cur = temp;我们一步一步来:
3)继续循环遍历,进行该操作。直到遍历到最后一个节点,也就是ele == null的时候。
4)最后我们返回最后一个节点,也就是pre节点。因为cur此时是最后一个不存在的节点,是null值(由代码可得)
代码实现:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null || head.next==null){
return head;
}
ListNode temp = null;
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
if(pre==null){
pre = cur;
cur = cur.next;
pre.next = null;
}else{
temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
}
return pre;
}
}