【Java】剑指offer(24)反转链表

简介: 【Java】剑指offer(24)反转链表

题目


定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。


思路


方法一:使用三个指针(pre,p,next)进行实现。令p指向pre,next则是用于防止链表断裂(很简单,详见代码)。


方法二(递归):找到最后一个结点作为返回值,递归函数中,找到最后的头结点后,开始进行每个结点next值的转换。


测试算例 ****


1.功能测试(链表有多个或一个结点)


2.特殊测试(头结点为null)


Java代码


新:


//iteratively
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        while(cur!=null){
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
    //recursively
    public ListNode reverseList1(ListNode head) {
        if(head == null || head.next==null)
            return head;
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }


旧:


package _24;
/**
 * 
 * @Description 面试题24:反转链表
 *
 * @author yongh
 * @date 2018年10月15日 下午3:24:51
 */
//题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的
//头结点。
public class ReverseList {
  public class ListNode {
  int val;
  ListNode next=null;
  ListNode(int val){
    this.val=val;   
  }
  }
  /*
  * 三个指针实现
  */
  public ListNode reverseList(ListNode head) {
  if(head==null)
    return null;
  ListNode pNode=head;
  ListNode preNode=null;
  ListNode nextNode=pNode.next;
  while(nextNode!=null) {
    pNode.next=preNode;
    preNode=pNode;
    pNode=nextNode;
    nextNode=pNode.next;
  }
  pNode.next=preNode;
  return pNode;
  }
  /*
  * 递归实现
  */
  public ListNode reverseList2(ListNode head) {
  if(head==null || head.next==null)
    return head;
  ListNode rvsHead=reverseList(head.next);
  //找到了最后的头结点后,开始转换每个结点的指向
  head.next.next=head;
  head.next=null;  
  return rvsHead;
  }
}


收获


1.与链表相关的题目总是涉及大量指针操作,以后遇到链表相关的题目时,多考虑指针的使用。


2.递归实现时,第50行:head.next=``null``; 别忘记了。


更多《剑指Offer》Java实现合集:https://github.com/gdutxiaoxu/Android_interview


相关文章
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
137 3
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
199 0
|
存储 Java
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
224 5
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
235 4
|
存储 Java
java实现单链表的创建、增、删、改、查
这篇文章详细介绍了Java中如何实现单链表的创建以及对单链表进行增加、删除、修改、查询等操作的方法,并提供了相应的代码示例。
java实现单链表的创建、增、删、改、查
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
|
存储 Java
java实现双向链表的增删改查
这篇文章展示了如何在Java中实现双向链表的增加、删除、修改和查询操作,并通过代码示例演示了在双向链表中存储和操作学生信息的过程。
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
217 0