`

Java实现单链表的逆转置

    博客分类:
  • java
阅读更多

单链表逆转置的递归与非递归方式

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package link.reverse;
// 定义一个单链表  
class Node { 
    //变量 
    private int record; 
    //指向下一个对象 
    private Node nextNode; 
    public Node(int record) { 
        this.record = record; 
    
    public int getRecord() { 
        return record; 
    
    public void setRecord(int record) { 
        this.record = record; 
    
    public Node getNextNode() { 
        return nextNode; 
    
    public void setNextNode(Node nextNode) { 
        this.nextNode = nextNode; 
    
     
/**
 *  两种方式实现单链表的反转(递归、普通)
*/
public class RevSingleLinkFactory { 
    /** 
     * 递归,在反转当前节点之前先反转后续节点 
     */
    //最终传递一个指向最后一个节点的变量
    public static Node reverse1(Node head) {
        //当为空或者本节点为末尾节点的时候
        if (head ==null ||head.getNextNode()==null)  
            return head; 
        Node reversedHead = reverse1(head.getNextNode());
        //获取先前的下一个节点,让该节点指向自身
        head.getNextNode().setNextNode(head); 
        //破坏以前自己指向下一个节点
        head.setNextNode(null);
        //层层传递给最上面的
        return reversedHead; 
    
     
    /** 
     * 遍历,将当前节点的下一个节点缓存后更改当前节点指针 
     */
    public static Node reverse2(Node head) { 
        if (null == head) { 
            return head; 
        
        Node pre = head; 
        Node cur = head.getNextNode(); 
        Node next; 
           
        while (cur !=null) {
            //断之前先找到原始的下一个节点
            next = cur.getNextNode();
            //逆序连接
            cur.setNextNode(pre); 
            //两个节点同时滑动
            pre = cur; 
            cur = next; 
        
      //将原链表的头节点的下一个节点置为null,再将反转后的头节点赋给head    
        head.setNextNode(null); 
        head = pre; 
        return head; 
    
     
public static void main(String[] args) { 
    //带有头结点
        Node head = new Node(0); 
        Node tmp = null;  // 保存临时变量
        Node cur = null;  // 始终指向末尾节点
        //构造一个长度为10的链表,保存头节点对象head
        //利用尾插入法
        for (int i = 1; i < 10; i++) { 
            tmp = new Node(i); 
            if (1 == i) { 
                head.setNextNode(tmp); 
            else 
                cur.setNextNode(tmp); 
            
            cur = tmp; 
        
        //打印反转前的链表 
        Node h = head; 
        while (h !=null) { 
            System.out.print(h.getRecord() + " "); 
            h = h.getNextNode(); 
        
        //调用反转方法 
        head = reverse1(head); 
        System.out.println("\n*******************"); 
        //打印反转后的结果 
        while (head !=null) { 
            System.out.print(head.getRecord() + " "); 
            head = head.getNextNode(); 
        
    
}

 

分享到:
评论

相关推荐

    数据结构(java版)习题解答

    - **题目**:实现在单链表中替换节点的操作。 - **解答**:定位到待替换节点的位置,并更新其值。 **习2.6:实验2.2首尾相接地连接两条单链表** - **题目**:连接两个单链表。 - **解答**:找到第一个链表的尾节点...

    数据结构(Java版)(第2版)习题解答

    第0章 Java程序设计基础 1 【习0.1】 实验0.1 哥德巴赫猜想。 1 【习0.2】 实验0.2 杨辉三角形。 1 【习0.3】 实验0.3 金额的中文大写形式。 1 【习0.4】 实验0.4 下标和相等的数字方阵。 1 【习0.5】 实验0.5 找出...

    数据结构Java版习题解答.doc

    数组和广义表是数据结构中两种常用的数据结构,本章节提供了数组和广义表的相关习题,包括求一个矩阵的转置矩阵等。 第6章 树和二叉树 树和二叉树是数据结构中两种重要的非线性结构,本章节提供了树和二叉树的相关...

    《数据结构(Java版)(第4版)》课程设计题..pdf

    要求学生根据指定的题目要求,使用Java编程语言实现数据结构的具体应用。 2. 线性表的表示与运算: - 排序单链表存储多项式的相关操作,包括多项式的相加与相乘。 - 排序循环双链表存储多项式的相关操作,同样是...

    《数据结构(Java版)(第4版)》课程设计题.pdf

    在课程设计中,学生需要实现稀疏矩阵的压缩存储,并且进行矩阵的基本运算,如矩阵的相加和转置。这一部分不仅考验学生的编程能力,还要求他们能够在数据存储和处理方面有更深层次的理解。 通过这些设计题目,学生将...

    链式队列.rar

    在编程语言中,链式队列的实现通常涉及到指针或者引用的概念,例如在C++、C#、Java等面向对象的语言中,可以定义一个节点类(Node)和一个队列类(Queue)。队列类包含对头节点和尾节点的引用,以及相关的操作方法。...

    各种算法的flash演示

    B树的删除.rar B树的生长过程.rar 三元组表的转置.rar 中序线索化二叉树.rar 串的顺序存储.rar 二分查找.rar 二叉排序树的删除.rar 二叉排序树的生成.rar 二叉树的建立.rar 克鲁斯卡尔...

    数据结构管理系统

    4. **矩阵代数**:矩阵的加法、乘法、转置、逆矩阵、行列式、秩和特征值等计算。 通过这个系统,用户可以进行以下活动: - 实时编程和调试:编写代码实现数据结构或代数系统,系统会提供反馈和错误检查。 - 测试和...

    从算法到数据结构

    - **单链表实现**:介绍单链表的基本操作,如插入、删除、查找等。 - **双向链表实现**:双向链表除了包含指向下一个节点的指针外,还包含一个指向前一个节点的指针。 - **删除链表中的结点**:在不给定头结点的...

    软件工程师找工作150问

    - 链表的基本概念:单链表、双链表、循环链表等。 - 链表的操作:插入、删除、查找等。 - 特殊链表的应用:如跳跃表、哈希链表等。 - 实际应用场景:例如在实现 LRU 缓存算法、文本编辑器等功能时。 ##### 低级...

Global site tag (gtag.js) - Google Analytics