鏈表是類似一種數(shù)據(jù)結(jié)構(gòu)的東西,就是分別存放有地址以及數(shù)據(jù)單項鏈表一般是上一個存放地址的地方存放下一個節(jié)點的地址,而雙向的就是有兩個存放地址的地方,分別存上一個以及下一個的地址。大概是這樣子
成都創(chuàng)新互聯(lián)專注于壽陽企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,電子商務(wù)商城網(wǎng)站建設(shè)。壽陽網(wǎng)站建設(shè)公司,為壽陽等地區(qū)提供建站服務(wù)。全流程按需定制制作,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
代碼:
//?刪除下標為index的節(jié)點
public?void?remove(int?index)?{
if?(index?=?modCount)?{
//?拋異常
System.out.println("indexOutOfBoundsException!");//?最好自定義異常拋出,這里演示
return;
}
Node?node?=?head;
//?如果節(jié)點為第一個節(jié)點
if?(index?==?0)?{
head?=?head.next;?//?將頭節(jié)點指向第二個節(jié)點
modCount--;
return;
}
//?如果節(jié)點為最后一個節(jié)點,找到最后一個節(jié)點的前一個節(jié)點,不用管
if?(index?==?modCount?-?1)?{
System.out.println("ddd");
//?找到最后一個節(jié)點的前一個節(jié)點
int?j?=?0;
while?(node?!=?null??j??index?-?1)?{
//?最后一個節(jié)點的前一個節(jié)點
node?=?node.next;
j++;
}
last?=?node;?//?最后一個節(jié)點設(shè)置為前一個節(jié)點
modCount--;
return;
}
//?如果節(jié)點為中間節(jié)點
int?j?=?0;
while?(node?!=?null??j??index?-?1)?{
//?查找被刪除的節(jié)點的前一個節(jié)點
node?=?node.next;
j++;
}
node.next?=?node.next.next;?//?被刪除節(jié)點的下一個節(jié)點設(shè)置為被刪除節(jié)點的下下個節(jié)點
modCount--;
}
java.util.Linkedlist是雙向鏈表,當然也就包括了單鏈表的功能,你可以去看他怎么寫的啊
public class SingleLinkedListE {
private EntryE first, last;
private int size = 0;
public void add(E element) {
EntryE newEntry = new EntryE(element, null);
if (first == null) {
first = last = newEntry;
} else {
last.next = newEntry;
last = newEntry;
}
++size;
}
public E get(int index) {
if (index 0 || index = size)
throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+size);
EntryE e = first;
for (int i = 0; i index; ++i)
e = e.next;
return e.data;
}
private static class EntryE {
Entry(E data, EntryE next) {
this.data = data;
this.next = next;
}
E data;
EntryE next;
}
}
這是我寫的一個差不多,你看一下吧:
package com.test.list;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class LinkedList {
public static void main(String[] args) {
MyList l = new MyList();
MyListNode node = l.createList();
l.printNode(node);
//l.searchNode(node, 4);
//node = l.insertNode(node, 3, "g");
//l.printNode(node);
node = l.deleteNode(node, "d");
l.printNode(node);
}
}
class MyListNode {
public String data;
public MyListNode nextNode;
}
class MyList {
public MyListNode createList() {
MyListNode node = new MyListNode();
MyListNode q ,p;
q = new MyListNode();
q = node;
while (true) {
String s = null;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
System.out.println("請輸入節(jié)點數(shù)據(jù):");
s = br.readLine();
if (s.equals("0")) {
break;
} else {
p = new MyListNode();
p.data = s;
p.nextNode = null;
q.nextNode = p;
q = p;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return node;
}
public void printNode(MyListNode node) {
MyListNode p = node.nextNode;
while (p!= null) {
System.out.print(" "+p.data);
p = p.nextNode;
}
}
public void searchNode(MyListNode node, int i){
MyListNode p = node.nextNode;
int j = 1;
while (p != null ji) {
p = p.nextNode;
j++;
}
if( p == null || ji) {
System.out.println("error");
}
System.out.println(" --"+p.data+"--");
}
public MyListNode insertNode(MyListNode node, int i ,String s) {
MyListNode p = node.nextNode;
int j = 1;
while (p != null ji-1) {
p = p.nextNode;
j++;
}
if( p == null || ji-1) {
System.out.println("error");
}
MyListNode n = new MyListNode();
n.data = s;
n.nextNode = p.nextNode;
p.nextNode = n;
return node;
}
public MyListNode deleteNode(MyListNode node ,String s) {
MyListNode p = node;
while(p.nextNode != null !p.nextNode.data.equals(s)) {
p = p.nextNode;
}
p.nextNode = p.nextNode.nextNode;
return node;
}
}
/*逆位序創(chuàng)建
public MyListNode createList() {
MyListNode node = new MyListNode();
node.nextNode = null;
while(true) {
String s = null;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
System.out.println("請輸入節(jié)點數(shù)據(jù):");
s = br.readLine();
if(s.equals("0")) {
break;
}else {
MyListNode n = new MyListNode();
n.data = s;
n.nextNode = node.nextNode;
node.nextNode = n;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return node;
}
*/
你可能對鏈表的數(shù)據(jù)結(jié)構(gòu)并不是很清楚?給你個寫示例代碼理解下,最好打個斷點每一步跟蹤理解一下
//class?ListNode?{
//????int?val;
//????jdb.ListNode?next;
//????ListNode(int?x)?{?val?=?x;?}
//}
public?class?Main?{
public?static?void?main(String[]?args)?throws?Exception?{
//現(xiàn)在有一個鏈表1-2-3
ListNode?listNode?=?new?ListNode(1);
listNode.next?=?new?ListNode(2);
listNode.next.next?=?new?ListNode(3);
listNode.next.next.next?=?new?ListNode(4);
//我們來打印一下
printListNode(listNode);
//我現(xiàn)在要在2后面插入9
boolean?flag?=?insertVal(listNode,?3,?9);
System.out.println("是否插入成功:"+flag);
//再來打印一下
printListNode(listNode);
}
/**
*
*?@param?listNode//原鏈表
*?@param?pre//插入前的位置
*?@param?val//插入的值
*/
public?static?boolean?insertVal(ListNode?listNode,Integer?pre,?Integer?val)?{
boolean?rs?=?false;
//找插入前的位置
while?(listNode?!=?null??listNode.val?!=?pre)?{
listNode?=?listNode.next;
}
if?(listNode?!=?null?listNode.val==pre)?{
//找到啦
//先把原鏈表后的數(shù)據(jù)保存起來?這邊就是3-4
ListNode?temp?=?listNode.next;
//把要插入的值連上,再把原來保存的值連上
listNode.next?=?new?ListNode(val);
listNode.next.next?=?temp;
//上面代碼中?listNode的值是2,listNode.next的值是9,listNode.next.next的值就是剛才保存的臨時鏈表3-4
//插入成功標記一下哦
rs=true;
}
return?rs;
}
/**
*?打印呀
*?@param?listNode
*/
public?static?void?printListNode(ListNode?listNode)?{
if?(listNode?!=?null)?{
ListNode?temp?=?listNode;
while?(temp?!=?null)?{
System.out.println(temp.val);
temp?=?temp.next;
}
}
System.out.println("-------------");
}
}