反转单链表(Java描述)

问题描述:
输入一个单链表,对其元素顺序进行反转后输出。

单链表节点定义:

public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

解法一:
从头节点开始,对每一个节点的next引用的方向进行反转,直到最后一个节点结束,代码如下:

public ListNode ReverseList(ListNode head) {
      if (head == null) 
        return head;

      ListNode cur  = head;  // 当前指向节点
      ListNode pre = null;   // cur节点的前个一节点 
      ListNode tmp = null;   // 辅助引用
      while (cur != null) {
          tmp = cur.next;
          cur.next = pre;    // 反转引用
          /* 将pre、cur前移一个节点 */
          pre = cur;         
          cur = tmp;
      }
      return pre;
  }

解法二:
进行如下迭代:删除头节点的后面一个节点,并加入到新链表的头部,直到头节点变成链表的最后一个节点结束。此法只涉及链表的两个基本操作:删除节点,加入节点。代码如下:

    public ListNode ReverseList(ListNode head) {
        if (head == null)      // 空链表
            return null;
        ListNode oldHead = head;
        while (oldHead.next != null) {
            // 删除原头结点的下一个节点
            ListNode tmp = oldHead.next;
            oldHead.next = oldHead.next.next;
            // 将被删除节点放到链表头部
            tmp.next = head;
            head = tmp;
        }
        return head;
    } 

解法三:
使用递归。对头节点后面的子链表进行反转,此后头节点会指向子链表的最后一个节点,修改相关我引用使其变成尾节点:

    public ListNode ReverseList(ListNode head) {
        if (head == null)       // 输入为null
            return null;

        if (head.next == null)  // 递归终止条件
            return head;

        ListNode ptr = head;
        head = ReverseList(head.next); // 反转子链表
        /* 头节点此时指向链表的最后一个节点,修改其next为null,
         并将子链表最后一个节点指向它,头节点就变成了尾节点*/
        ptr.next.next = ptr;
        ptr.next = null;

        return head;
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值