牛客题霸NC78反转链表Java题解
https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=117&&tqId=35000&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
方法1:双指针
解题思路:当链表为空head==null 或长度为1时,直接返回head。定义pre和cur两个节点分别指向null和head节点。然后开始从head节点依次修改指针。先利用tmp节点暂存当前节点的下一个节点,再将当前节点指向它的前一个节点pre,然后再将pre节点和当前节点cur往后移一位,再修改下一个节点的指针。
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null || head.next==null){ //判断链表为空或长度为1的情况
return head;
}
ListNode pre = null;
ListNode cur = head;
ListNode tmp = null; //记录当前节点的下个节点
while(cur!=null){
tmp = cur.next; //记录当前节点的下一个节点
cur.next = pre; //让当前节点的next指向前一个节点
pre = cur; //pre往前移动一位
cur = tmp; //当前节点往后移动一位
}
return pre;
}
}方法2:递归
解题思路:利用递归,从后往前返回,倒序依次修改指针,完成链表反转
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
return reverse(head,null);
}
private ListNode reverse(ListNode cur,ListNode pre){
if(cur == null){ //当前节点为null时,返回
return pre;
}
ListNode node = reverse(cur.next,cur); //递归下一个节点
cur.next = pre; //当前节点指向前一个节点
return node;
}
}
京公网安备 11010502036488号