设计链表
设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val
和 next
。
val
是当前节点的值,next
是指向下一个节点的指针/引用。
public class MyLinkedList { //单链表结点类 public class Node{ public int val; public Node next; //实例构造器 public Node(int item) => val=item; } //头结点和数量 public Node head; public int count; public int Get(int index) { if(index>=count) return -1;//判断索引是否越界 Node p=head; int num=0; //遍历链表,找到索引指向的结点位置,返回该结点的值 while(true){ if(num==index) return p.val; num++; p=p.next; } } public void AddAtHead(int val) { Node p=new Node(val);//更新head p.next=head; head=p; count++; } public void AddAtTail(int val) { Node p=new Node(val); Node q=head; //遍历链表找到尾部,添加节点 while(q.next!=null) q=q.next; q.next=p; count++; } public void AddAtIndex(int index, int val) { //索引为0直接执行在头结点前添加结点的方法 if(index==0){ AddAtHead(val); return; } //索引和链表长度相直接执行在尾部添加结点的方法 if(index==count){ AddAtTail(val); return; } if(index>=count) return;//索引越界直接返回 int num=0; Node p=head; //循环遍历,在索引指向结点之前添加结点 while(true){ num++; if(num==index){ Node q=new Node(val); q.next=p.next; p.next=q; count++; return; } p=p.next; } } public void DeleteAtIndex(int index) { if(index>=count) return;//索引越界直接返回 int num=0; Node p=head; //遍历链表,删除索引指向的结点 while(true){ num++; if(num==index){ p.next=p.next.next; count--; return; } p=p.next; } } }
单链表节点类
LeetCode笔记中链表相关题目,若不单独说明,代码中使用的链表都是单链表,其节点类如下代码所示。
/** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public ListNode(int x) { val = x; } * } */