java中单链表倒转的实现方法

本文记录了一种Java中单链表反转的实现方法,通过详细步骤和代码解析,展示了如何利用节点的next属性逐步倒转单链表。
摘要由CSDN通过智能技术生成
java中有关单链表反转的方法有很多种,这里记录一种并附上详细步骤:

代码如下

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode reverseList(ListNode head) { 
        ListNode pre;
        ListNode temp;
        pre = head; // 前驱节点
        ListNode cur = head.next //当前节点

        while(cur != null && cur.next != null){
            temp = cur.next;    //(1)
            cur.next = pre;        //(2)
            pre = cur;     //(3)
            cur = temp;          //(4)

        }
        head.next = null //原头节点,反转后尾节点
        return pre;   //原尾节点  反转后头节点
    }
}

主要的操作是在while循环中,下面画图解释一下是如何实现单链表倒转的:
首先java中没有指针的概念,但是可以看到ListNode中的next属性其实就代表指向下一个节点的“指针”,因此可以这样来理解:

1、原单链表:

假设单链表有三个元素[1,2,3],0为上述的头对象

2、执行(1)、(2)后:

cur.next指向了n.next:
这里写图片描述

3、执行(3):

这里写图片描述

4、执行(4):

这里写图片描述
第一次循环结束,第一次循环后的单链表如上图所示。
cur != null && cur.next != null,因此执行第二次循环:

5、第二次执行(1),(2):

这里写图片描述

6、第二次执行(3):

这里写图片描述

7、第二次执行(4):

这里写图片描述
cur.next == null 推出循环
以上,实现单链表的倒转。

Java,单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。单向链表的特点是只能从头节点开始遍历到尾节点,不能反向遍历。 下面是一个简单的Java实现单向链表的例子: ```java public class Node { int data; // 节点数据 Node next; // 指向下一个节点的指针 public Node(int data) { this.data = data; this.next = null; } } public class LinkedList { Node head; // 链表头节点 public LinkedList() { this.head = null; } // 在链表尾部添加节点 public void add(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; } else { Node current = head; while (current.next != null) { current = current.next; } current.next = newNode; } } // 在链表查找某个节点是否存在 public boolean contains(int data) { Node current = head; while (current != null) { if (current.data == data) { return true; } current = current.next; } return false; } // 删除链表第一个出现的指定节点 public void remove(int data) { if (head == null) { return; } if (head.data == data) { head = head.next; return; } Node current = head; while (current.next != null) { if (current.next.data == data) { current.next = current.next.next; return; } current = current.next; } } // 获取链表的节点数 public int size() { int count = 0; Node current = head; while (current != null) { count++; current = current.next; } return count; } } ``` 在上面的代码,Node类表示链表节点,LinkedList类表示单向链表。它包含了添加、查找、删除和获取节点数等常见操作。你可以根据自己的实际需求来对链表进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值