自学内容网 自学内容网

反转链表(Leetcode)

反转链表

Leetcode题目链接

题意:翻转一个单链表

🌰:

输入: 1->2->3->4->5->NULL

输出: 5->4->3->2->1->NULL

在链表本身进行反转即可,不用重新定义链表,这同时浪费时间和空间。

需要采用哑节点吗?
不需要的,如果使用了哑节点还会造成报错。
如果给原链表添加哑节点:
dummy ->1->2->3->4->5->NULL
那么我们反转后就变成了:
5->4->3->2->1->dummy
这是不合理的,所以不使用哑节点。
还有一个问题,循环判断的条件是什么?
在该问题中,当链表被遍历到末尾后,程序便结束。
所以需要一个条件来确定链表是否已经被遍历到末尾。
代码如下:

class Solution{
  public ListNode reverseList(ListNode head){
    ListNode pre = null;
    ListNode cur = head;
    ListNode next = null;
    while(cur != null){
       next = cur.next;
       cur.next = pre;
       pre = cur;
       cur = next;
    }
      //注意,反转链表后,原来的末尾成为现在的头
     return pre; 
  }
}

递归方法:

// 递归 
// 递归的核心思路和双指针是一样的。
class Solution {
    public ListNode reverseList(ListNode head) {
        return reverse(null, head);
    }

    private ListNode reverse(ListNode prev, ListNode cur) {
        // 注意递归出来的条件,当前节点为null,表明已经遍历完成
        if (cur == null) {
            return prev;
        }
        ListNode temp = null;
        temp = cur.next;// 先保存下一个节点
        cur.next = prev;// 反转
        // 更新prev、cur位置
        // prev = cur;
        // cur = temp;
        return reverse(cur, temp);
    }
}

原文地址:https://blog.csdn.net/weixin_62075640/article/details/143607061

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!