牛客题霸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; } }