转行不易,没有系统的学习数据结构,缺乏认知,现在开始从零学起。
总的来说,就是每个节点包含当前节点的值,并指向下一个节点,彼此关联。笔者java出身,从java的角度说,像是多层对象的递归赋值,因此,基于此逻辑,实现我们的单链表构造和基本的头尾插入、指定位置插入、指定位置删除。
废话不多说,直接亮代码:
package singlelinkedList; /** * Message: 单链表实现 * <p> * Content: 包含链表构造,头尾插入,指定位置插入,指定位置删除 * * @author lucky * create on 2018/07/31 */ public class Node { public int data; public Node next; public Node(){} public Node(int value){ this.data = value; } /** * 递归打印链表 * @param node */ public static void ScanNode(Node node){ if (node.next != null){ System.out.println(node.data); ScanNode(node.next); }else { System.out.println(node.data); } } /** * 尾插入 * 增加一个node,遍历需要插入的node的所有节点, * 找出下一个节点为空的,默认为尾节点,插入新值 * * @return */ public static Node addNode(Node source,Node newNode){ Node temp = source; while (temp.next != null) { temp = temp.next; } temp.next = newNode; return source; } // /** // * 头插入 // * 直接将新节点的下一节点指向已定义的节点即可 // * // * @return // */ // public static Node addNode(Node source,Node newNode){ // // newNode.next = source; // // return newNode; // // } /** * 插入节点到指定位置,需要将其余位置的节点后移 * * @param */ public static Node insertNodeByIndex(Node source,int index,Node newNode){ Node temp = source; int i = 0; while (i < index){ if(temp.next == null) { temp.next = newNode; return temp; } else { temp = temp.next; i++; } } newNode.next = temp.next; temp.next = newNode; return temp; } public static Node delNodeByIndex(Node source,int index){ Node temp = source; int i = 0; while (i < index){ if(temp.next == null) { return temp; } else { temp = temp.next; i++; } } temp.next = temp.next.next; return temp; } public static void main(String[] args){ int[] arrays = {2,3,4,5,7,6,1}; Node node = null; for (int i = 0; i < arrays.length;i++) { if(i==0){ node = new Node(arrays[i]); } else { Node newNode = new Node(arrays[i]); node = addNode(node,newNode); } } ScanNode(node); System.out.println("===========下一个开始============="); insertNodeByIndex(node,3,new Node(11)); ScanNode(node); System.out.println("===========下一个开始============="); delNodeByIndex(node,3); ScanNode(node); } }
一套思考加实现,一个小时就过去了,后面将尝试几个与单链表相关的算法实现,敬请关注~
每天一小时,进步一丢丢!