链表
来源:互联网 发布:网络钵钵鸡什么意思 编辑:程序博客网 时间:2024/06/05 06:09
链表(Linked list)是一种常见的线性数据结构。单向链表中每个结点都有一个next指针指向下一个结点,双向链表则多一个指向上一个结点的指针。搜索链表和查找第n个数据的时间复杂度都是O(n)。链表的优势在于在任意位置删除和插入数据时效率高(不用改变其他节点位置)
一. 单链表的定义以及一些基本操作实现(java)
/* * 定义一个结点类 */ public class Node { Node next; //指向下一结点的指针 int data; //该节点存储数据 public Node(int data){ this.data = data; } //显示此结点 public void show(){ System.out.print(data + " "); }}/* * 定义一个链表主类,并且定义各种对链表操作的方法 */ public class List { public Node head; //定义一个头结点 public Node tail; //定义一个尾指针 //定义一个空链表 public List(){ head = null; tail = head; } //插入结点(2种) public void addToList(int data){ //1.在尾部直接插入 Node node = new Node(data); if(head == null){ head = node; }else{ tail.next = node; } tail = node; } public void addToList(int index, int data){ //2.在任意位置插入 Node node = head; int i = 0; while(node!=null && i<index-2){ node = node.next; i++; } Node insert = new Node(data); insert.next = node.next; node.next = insert; } //删除一个结点(2种) public void deleteByIndex(int index){ //1.根据位置删除 Node node = head; int i = 0; while(node!=null && i<index-2){ node = node.next; i++; } node.next = node.next.next; } public void deleteByData(int data){ //2.根据数据删除(只操作第一个) Node current = head; Node previous = head; //记住上一个节点 int i = 0; while (current.data != data){ if(current.next == null){ i = 1; break; } previous = current; current = current.next; } if(i==0){ if(current == head) { head = head.next; }else{ previous.next = current.next; } } } //改变指定位置的结点数值 public void change(int index, int data){ Node node = head; int i = 0; while(node!=null && i<index-2){ node = node.next; i++; } node.next.data = data; } //查找结点信息(3种) public void showAllNodes(){ //1.显示所有结点信息 Node node = head; //还可以用递归形式遍历 while(node!=null){ node.show(); node = node.next; } System.out.println(); } public Node findByIndex(int index){ //2.根据位置查找 Node node = head; int i = 0; while(node!=null && i<index-1){ node = node.next; i++; } return node; } public Node findByData(int data){ //3.根据数据查找(只操作第一个) Node current = head; while(current.data != data){ if(current.next == null) return null; else current = current.next; } return current; }}
二. 面试中经常出现的链表相关问题(用java实现)
(没有实现的,后续一一补充)
- 1.求单链表中结点的个数
public int getLength(Node head){ if(head == null){ return 0; } //注意链表为空时的情况 else{ Node node = head; int length = 0; while(node != null){ length++; node = node.next; } return length; }}
2.将单链表反转
3.查找单链表中的倒数第K个结点(k > 0)
4.查找单链表的中间结点
5.从尾到头打印单链表
6.已知两个单链表各自有序,把它们合并成一个链表依然有序
7.判断一个单链表中是否有环
8.判断两个单链表是否相交
9.求两个单链表相交的第一个节点
10.已知一个单链表中存在环,求进入环中的第一个节点
11.给出一单链表头指针和一节点指针,O(1)时间复杂度删除该节点
阅读全文
0 0