1.根据索引index获取对应节点的值原则:注意Index从0开始
遍历i时同步遍历节点p.找到index对应的p。
ListNode p = head.next;
for (int i = 0; i < index; i++) {
p = p.next;
}
2. 链表头部添加原则:
head.next = new ListNode(value, head.next);
3.链表尾部添加原则:
(1)先找到最后一个节点:
ListNode p = head;
for (; p.next != null; p = p.next) {
}
return p;
(2)添加新元素
listNode.next = new ListNode(value, null);
4.根据索引index插入元素的原则:
(1)index=0:头部插入元素,
(2)index=size尾部插入元素
(3)其他情况:找当前插入节点的前一个节点。
ListNode pre = head;
for (int i = 0; i < index; i++) {
pre = pre.next;
}
pre.next = new ListNode(value, pre.next);
5.根据索引删除节点的原则:也是前找当前要删除节点的前一个节点
ListNode pre = head;
for (int i = 0; i < index; i++) {
pre=pre.next;
}
pre.next=pre.next.next;
java代码
public class singlaList707 {
//1、设计单链表的结构
private class ListNode {
int value;
ListNode next;
public ListNode() {
}
public ListNode(int value, ListNode next) {
this.value = value;
this.next = next;
}
}
//2、存储链表节点的个数
int size = 0;
//虚拟节点
ListNode head = new ListNode(-1, null);
//3、循环遍历
public void Forfor(Consumer<Integer> consumer) {
for (ListNode p = head.next; p != null; p = p.next) {
consumer.accept(p.value);
}
}
//4、头部添加节点
public void addAtHead(int value) {
head.next = new ListNode(value, head.next);
size++;
}
//5、获取链表中第n个节点的值,即根据索引index获得值
public int get(int index) {
if (index < 0 || index >= size) { //注意index>=index
return -1;
}
ListNode p = head.next;
for (int i = 0; i < index; i++) {
p = p.next;
}
return p.value;
}
//6、找最后一个节点
public ListNode findList() {
ListNode p = head;
for (; p.next != null; p = p.next) {
}
return p;
}
//7、链表尾部追加元素
public void addAtTail(int value) {
ListNode listNode = findList();
listNode.next = new ListNode(value, null);
size++;
}
//8、根据索引插入元素,即在此索引位置处的节点前插入节点
//规则:index>size,返回-1;
// 当index<=size(7)时index=0或index=-1,即第一个节点前插入元素;
// 特殊:index=7时因链表中并没有索引为7的节点,故在索引为6的后面即链表尾部添加节点
public void addAtIndex(int index, int value) {
if (index > size) {
return;
}
if (index < 0) {
index = 0;
}
size++;
ListNode pre = head;
for (int i = 0; i < index; i++) {
pre = pre.next;
}
pre.next = new ListNode(value, pre.next);
}
//9、根据索引删除节点
public void deleteAtIndex(int index){
if(index>=size || index<0||size==0){
return;
}
ListNode pre = head;
for (int i = 0; i < index; i++) {
pre=pre.next;
}
pre.next=pre.next.next;
size--;
}
}
测试
//头部插入节点测试
@Test
public void test7(){
singlaList707 list = new singlaList707();
list.addAtHead(6);
list.addAtHead(1);
list.addAtHead(4);
list.addAtHead(9);
list.addAtHead(10);
//10->9->4->1->6
list.Forfor(s-> System.out.println(s));
System.out.println("-------------------------");
System.out.println(list.get(0));
System.out.println(list.get(4));
}
//尾部插入节点测试
@Test
public void test8(){
singlaList707 list = new singlaList707();
list.addAtTail(6);
list.addAtTail(1);
list.addAtTail(4);
list.addAtTail(9);
list.addAtTail(10);
//6->1->4->9->10
list.Forfor(s-> System.out.println(s));
System.out.println("-------------------------");
System.out.println(list.get(0));
System.out.println(list.get(4));
}
//据索引添加节点--
@Test
public void test9(){
singlaList707 list = new singlaList707();
list.Forfor(s-> System.out.println(s));
list.addAtIndex(-1,2);
System.out.println("链表为空,index=-1");
list.Forfor(s-> System.out.println(s));//2
System.out.println("链表中有一个节点,index=0");
list.addAtIndex(0,4);
list.Forfor(s-> System.out.println(s));//4->2
System.out.println("链表中有2个节点,index=2");
list.addAtIndex(2,6);
list.Forfor(s-> System.out.println(s));//4->2->6
System.out.println("链表中有3个节点,index=1");
list.addAtIndex(1,3);
list.Forfor(s-> System.out.println(s));//4->3->2->6
}
//根据索引删除节点
@Test
public void test10(){
singlaList707 list = new singlaList707();
list.deleteAtIndex(0);
list.Forfor(s-> System.out.println(s));
list.addAtTail(6);
list.addAtTail(1);
list.addAtTail(4);
list.addAtTail(9);
list.addAtTail(10);
//6->1->4->9->10
list.deleteAtIndex(0);
System.out.println("删除索引index=0处的节点");
list.Forfor(s-> System.out.println(s));//1->4->9->10
System.out.println("删除索引index=2处的节点");
list.deleteAtIndex(2);
list.Forfor(s-> System.out.println(s));//1->4->10
System.out.println("尾部添加节点");
list.addAtTail(9);
list.Forfor(s-> System.out.println(s));//1->4->10->9
System.out.println("删除尾部的节点");
list.deleteAtIndex(3);
list.Forfor(s-> System.out.println(s));//1->4->10
}