-
定义
- 单链表是一种线性数据结构,其中每个元素都是一个独立的对象。每个元素(或称为节点)都包含两个项:数据和指向下一个节点的引用(或称为指针)。最后一个节点的指针通常指向null,表示链表的末尾。
-
底层实现
- 节点
public class Node { int data; Node next; public Node(int data, Node next) { this.data = data; this.next = next; } }
- 单链表实现
public class SingleLinkedList { //头指针 Node head; //创建头节点(data域表示元素个数) public SingleLinkedList() { this.head = new Node(0,null); } //1.添加元素到链表末尾 public void append(int data){ Node newNode = new Node(data, null); //临时指针 Node currentNode = head; while (currentNode.next != null){ currentNode=currentNode.next; } currentNode.next=newNode; head.data++; } //2.在链表头部添加元素 public void addFirst(int data){ Node newNode = new Node(data, null); newNode.next=head.next; head.next=newNode; head.data++; } //3.删除链表中第一个等于给定值的元素 public void remove(int data){ Node currentNode = head; while (currentNode.next != null){ if (currentNode.next.data == data){ currentNode.next=currentNode.next.next; head.data--; return; } currentNode=currentNode.next; } } //4.打印链表 public void print(){ Node currentNode = head.next; while (currentNode != null){ System.out.print(currentNode.data+" "); currentNode=currentNode.next; } System.out.println("null"); } }
- 节点
-
Java中的linkedlist类实现单链表
- 单链表实现
public class LinkListJavaDemo { private LinkedList<Integer> list; //创建单链表 public LinkListJavaDemo() { list = new LinkedList<>(); } //1.添加到头部 public void addFirst(int data){ list.addFirst(data); } //2.添加到尾部 public void addLast(int data){ list.addLast(data); } //3.获取元素数量 public int size(){ return list.size(); } //4.删除元素中第一个符合给定值的元素 public void removeFirst(int data){ list.removeFirstOccurrence(data); } //5.打印链表 public void printLinkList(){ for (int data:list){ System.out.print(data+"->"); } System.out.println("null"); } }
- 单链表实现
-
带头节点和不带头节点的利弊
- 带头结点的单链表:
优点:便于实现“插入”操作。在带头结点的单链表中,插入操作不需要判断当前链表是否为空,直接将新结点插入到头结点之后即可。
缺点:增加了一个额外的结点,占用一定的存储空间。
初始化链表时需要单独处理头结点,增加了一定的复杂度。
不带头结点的单链表:优点:不占用额外的存储空间。
初始化链表时不需要单独处理头结点,代码更简洁。
缺点:处理空链表时容易引发异常。在进行链表操作时,如果未检查链表是否为空,直接访问头结点可能会导致空指针异常。
实现“插入”操作时需要判断链表是否为空,增加了一定的复杂度。
总结:在实际应用中,可以根据具体需求和场景选择合适的实现方式。如果需要频繁地进行插入操作,或者需要处理空链表,带头结点的单链表可能是更好的选择。如果不希望占用额外的存储空间,或者需要简化代码,不带头结点的单链表也是一个不错的选择。
06-28