Singly Link List(单链表的实现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

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

package
com.datastructure.singlylinklist;

/**

 * 实现一个单链表

 * 实现功能:

 * 增加一个节点(头插法,尾插法)

 * 删除一个节点(删除第一个节点,删除最后一个节点,删除任何一个节点)

 * 查找(查找到一个list中的某个元素)

 * @author Xinyuyu

 *

 */

public
class SinglyLinkList <T> {

    /*

     * 实现一个节点的数据结构

     * 数据域

     * 指针域

     */

    // header指向list的头

    // tail指向list的尾

    private
IntSLLNode header;

    private
IntSLLNode tail;

    class
IntSLLNode{

        public
Object data;

        public
IntSLLNode next;

        //

        public
IntSLLNode(Object data){

            this(data, null);

        }

        public
IntSLLNode(Object data, IntSLLNode next){

            this.data = data;

            this.next = next;

        }

    }

    

    public
SinglyLinkList(){

        header = tail = null;

    }

    // 头插法增加一个节点

    public
void addToHeader(Object o){

        // 链表不为空的情况

        // 链表为空的情况

        header = new
IntSLLNode(o, header);

        if(tail == null)

            tail = header;

    }

    // 尾插法增加一个节点

    public
void addToTail(Object o){

        // 链表不为空的情况

        // 链表为空的情况

        IntSLLNode newNode = new
IntSLLNode(o);

        if(!isEmpty()){

            tail.next = newNode;

            tail = newNode;

        }else

            tail = header = newNode;

    }

    // 删除第一个节点

    public
Object deleteFromHeader() throws
Exception{

        // 链表不为空切大于一个节点

        // 链表仅有一个节点

        // 链表为空

        IntSLLNode node = header;

        if(!isEmpty()){

            header = header.next;

        }else
if(!isEmpty() && header == tail){

            tail = header = null;

        }else{

            // 链表为空抛出异常

            throw
new Exception("SSL is empty");

        }

        

        return
node.data;

    }

    // 删除最后一个节点

    public
Object delteFromTail() throws
Exception{

        // 链表不是空且大于一个节点的时候

        // 链表仅有一个节点的时候

        // 链表是空的情况

        IntSLLNode node = tail;

        if(!isEmpty() && header != tail){

            // 一个临时指针,指向头节点,遍历到倒数第二个节点出,将尾指针指向倒数第二个节点

            IntSLLNode temp = header;

            for(; temp.next != tail;){

                temp = temp.next;

            }

            tail = temp;

            temp.next = null;

        }else
if(!isEmpty() && header == tail){

            tail = header  = null;

        }else{

            // 当列表为空的时候抛出异常

            throw
new Exception("SSL is empty");

        }

        return
node.data;

    }

    // 删除链表中的某个节点

    public
Object delete(Object o) throws
Exception{

        // 链表不为空且包含大于一个节点

        // 链表仅包含一个节点

        // 链表为空的情况

        

        // 删除的为第一个节点

        if(o.equals(header.data)){

            return
deleteFromHeader();

            // 删除的为最后一个节点

        }else
if(o.equals(tail.data)){

            return
delteFromTail();

        }else{

            IntSLLNode temp = header;

            if(!isEmpty() && header != tail){

                for(; !temp.next.data.equals(o);){

                     temp = temp.next;

                }

                if(temp != null){

                    temp.next = temp.next.next;

                    temp = temp.next;

                }

            }else
if(!isEmpty() && header == tail){

                if(header.equals(o)){

                    temp = header;

                    header = tail = null;

                }

            }else{

                throw
new Exception("SSL is empty");

            }

            return
temp.data;

        }

        // 如果查找到就返回一个节点信息

        // 查找不到

    }

    // 删除节点的另外一个写法(需要两个指针)

    public
Object deletePro(Object o) throws
Exception{

        // 链表不为空且大于一个节点

        // 链表仅包含一个节点

        // 链表为空

        IntSLLNode node = null;

        if(header.data.equals(o)){

            return
deleteFromHeader();

        }

        if(!isEmpty() && header != tail){

            IntSLLNode pre = header, las = header.next;

            for(; las != null
&& !las.data.equals(o); ){

                pre = pre.next;

                las = las.next;

            }

            if(las != null)

                pre.next = las.next;

            else

                return
delteFromTail();

            node = las;

        }else
if(!isEmpty() && header == tail){

            if(header.equals(o));

                tail = header = null;

        }else{

            throw
new Exception("SSL is empty");

        }

        return
node.data;

    }

    // 查找链表中的某个节点

    public
Object find(Object o) throws
Exception{

        // 链表为空

        // 链表不为空

        IntSLLNode temp = null;

        if(!isEmpty()){

            temp = header;

            for(; temp != null
&& !temp.data.equals(o); ){

                temp = temp.next;

            }

            if(temp == null)

                return
null;

            else

                return
temp.data;

        }else{

            // 当链表为空的时候也就是不会查找到需要的节点

            throw
new Exception("The object is not exist in the SLL");

        }

    }

    

    // 判断链表是否为空

    public
boolean isEmpty(){

        return
header == null;

    }

    

    // 打印出链表

    public
void printSinglyLinkList(String name){

        System.out.print(name + " : ");

        for(IntSLLNode tempNode = header; tempNode != null; tempNode = tempNode.next){

            System.out.print(tempNode.data.toString() + "->");

        }

    }

    // 清空列表

    public
void emptySLL(){

        header = tail = null;

    }

}

?





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

package
SinglyLinkList;

public class Persion {

    private
String name;

    private
int
age;

    

    public
Persion(String name, int
age) {

        this.name = name;

        this.age = age;

    }

    public
String getName() {

        return
name;

    }

    public
void setName(String name) {

        this.name = name;

    }

    public
int getAge() {

        return
age;

    }

    public
void setAge(int
age) {

        this.age = age;

    }

    

    public
String toString(){

        return
"[" + this.name + " age is "
+ this.age + "]";

    }

    // 需要重写equal方法来完成删除和查找

    @Override

    public
boolean equals(Object o) {

        if(this.name.equals(((Persion) o).getName()) && this.age == ((Persion) o).getAge())

            return
true;

        else

            return
false;

    }

}

?





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

package
SinglyLinkList;

import com.datastructure.singlylinklist.SinglyLinkList;

public class TestOfSinglyList {

    public
static void main(String[] args) {

        SinglyLinkList<Persion> singlyLinkList = new
SinglyLinkList<Persion>();

        Persion p1 = new
Persion("张三", 34);

        Persion p2 = new
Persion("李四", 24);

        Persion p3 = new
Persion("王五", 44);

        Persion p4 = new
Persion("李以", 44);

        Persion p5 = new
Persion("王七", 44);

        

        // 完成头插法

        singlyLinkList.addToHeader(p1);

        singlyLinkList.addToHeader(p2);

        singlyLinkList.addToHeader(p3);

        singlyLinkList.addToHeader(p4);

        singlyLinkList.addToHeader(p5);

        

        singlyLinkList.printSinglyLinkList("完成头插法");

        System.out.println();

//      System.out.println();

//      // 清空链表

//      singlyLinkList.emptySLL();

//      // 完成尾插法

//      singlyLinkList.addToTail(p1);

//      singlyLinkList.addToTail(p2);

//      singlyLinkList.addToTail(p3);

//      singlyLinkList.printSinglyLinkList("完成头插法");

//      System.out.println();

//      // 完成删除尾节点

//      try {

//          Persion p = (Persion)singlyLinkList.delteFromTail();

//          singlyLinkList.printSinglyLinkList("删除了最后一个节点");

//          System.out.println();

//          System.out.println("被删除的尾节点是 :" + p.getName() + " age is " + p.getAge());

//      } catch (Exception e) {

//          e.printStackTrace();

//      }

//      // 完成删除头节点

//      try {

//          Persion p = (Persion)singlyLinkList.deleteFromHeader();

//          singlyLinkList.printSinglyLinkList("删除了第一个节点");

//          System.out.println();

//          System.out.println("被删除的头节点是 :" + p.getName() + " age is " + p.getAge());

//      } catch (Exception e) {

//          e.printStackTrace();

//      }

        // 删除任意一个节点

        //Persion p = new Persion("张三", 34);

        try
{

            singlyLinkList.deletePro(p5);

            singlyLinkList.deletePro(p4);

            singlyLinkList.deletePro(p3);

            singlyLinkList.deletePro(p2);

            singlyLinkList.deletePro(p1);

            

            

        } catch
(Exception e) {

            e.printStackTrace();

        }

        singlyLinkList.printSinglyLinkList("任意删除一个节点");

        System.out.println();

        try
{

            System.out.println(singlyLinkList.find(p1));

        } catch
(Exception e) {

            e.printStackTrace();

        }

    }

}

Singly Link List(单链表的实现java)

时间: 2024-10-11 23:19:46

Singly Link List(单链表的实现java)的相关文章

单链表的实现-JAVA

该内容为转载,原地址: 数据结构(一) 单链表的实现-JAVA 数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数组.树这种顺序来学习数据结构这门课程把. -WH 一.单链表的概念 链表是最基本的数据结构,其存储的你原理图如下图所示 上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数

数据结构(一) 单链表的实现-JAVA

数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数组.树这种顺序来学习数据结构这门课程把. -WH 一.单链表的概念 链表是最基本的数据结构,其存储的你原理图如下图所示 上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一

单链表逆置Java

package com.kpp; /** * 单链表逆置 * 将单链表从第一个结点和第二个节点之间断开,然后将第2,3...个结点依次插入第一个结点之前 * @author kpp * */ class LNode{ private String data; private LNode next; } public class LinkedListReverse { private static void reverse(LNode head){ if(head == null||head.ne

【转】单向链表(单链表)的Java实现

最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关 于Web的学了一点Html+css+javascript.因为比较偏好,学习WinForm时比较认真,数据库操作也自己有所研究.但链表这个东西我 还真没有学习和研究过,加上最近自己在看WPF,而课程也到了JSP了,比较紧. 但是我还是抽了一个晚上加半天的时间看了一下单向链表.并且使用Java试着写了一个实例出来.没有接触过链表的朋友可以作为参考,希望大家多提

java数据结构:单链表常见操作代码实现

一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashMap等集合的底层结构都是链表结构.链表以结点作为存储单元,这些存储单元可以是不连续的.每个结点由两部分组成:存储的数值+前序结点和后序结点的指针.即有前序结点的指针又有后序结点的指针的链表称为双向链表,只包含后续指针的链表为单链表,本文总结的均为单链表的操作. 单链表结构: Java中单链表采用No

线性表—单链表

.1.链式存储结构实现 单链表和双链表(这边讲单链表). 2.基础概念 a.结点:结点由数据域和地址域(链)两部分组成.而结点整体在效果上可以看作是该结点的地址(指针).这个地址域一般是后继元素的地址(即下一个结点的总体).所以最后一个元素的地址域为^,其表示空,即没有后续元素.b.单链表:每个结点只有一个地址域的线性链表称为单链表.c.双链表:每个结点有两个地址域的线性表链称为双链表,两个地址域分别指向前驱元素和后继元素. 3.单链表的实现 线性表接口LList: package com.cl

C语言单链表

学过线性表中的顺序表的都知道,顺序表里的数据在物理内存上是相邻的,所以当我们在顺序表中想要访问下一个元素时可以直接去访问,就像数组一样.但是单链表却不同,单链表的数据存储的位置是动态分配的,也就是说单链表的存储在物理内存上不是相邻的,所以我们就只能通过指针这种方式来把单链表串起来,通过指针来访问下一个结点. 单链表结点 单链表的结点里有数据域和指针域,数据域是用来储存数据的,指针域是用来储存直接后继结点的域. typedef struct Node{ int data;//数据域 struct

【算法导论学习-23】两个单链表(single linked)求交点

问题:A.B两个单链表如果有交点,返回第一个交点在A中的位置(链表头结点位置为0). 分析:A.B如果有交点,交点的后继一定也是交点,所以一定是Y型相交,所以算法的思想如下 1)  求得A.B的长度,比如ALength,Blength 2)  判断ALength,Blength谁大,比如Alength>Blength 3)  Alength移动到Alength-Blength的位置,开始判断每个节点是否相等,相等则退出. 以本博客中"[算法导论学习-20]单链表(single linked

单链表反转(Singly Linked Lists in Java)

单链表反转(Singly Linked Lists in Java) 博客分类: 数据结构及算法 Java代码   package dsa.linkedlist; public class Node<E>{ E data; Node<E> next; } Java代码   package dsa.linkedlist; public class ReverseLinkedListRecursively { public static void main(String args[])