1.先定義一個(gè)節(jié)點(diǎn)類
創(chuàng)新互聯(lián)服務(wù)緊隨時(shí)代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過十余年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計(jì)師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊(duì)以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對(duì)網(wǎng)站進(jìn)行成都做網(wǎng)站、網(wǎng)站建設(shè)、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對(duì)外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。
package com.buren;
public class IntNode {
//定義一個(gè)節(jié)點(diǎn)類
int
info;
//定義屬性,節(jié)點(diǎn)中的值
IntNode next;
//定義指向下一個(gè)節(jié)點(diǎn)的屬性
public IntNode(int
i){ //構(gòu)造一個(gè)next為空的節(jié)點(diǎn)
this(i,null);
}
public IntNode(int i,IntNode
n){ //構(gòu)造值為i指向n的節(jié)點(diǎn)
info=i;
next=n;
}
}
2.再定義一個(gè)鏈表類,這是主要部分
package com.buren;
public class IntSLList {
private IntNode head,tail;
//定義指向頭結(jié)點(diǎn)和尾結(jié)點(diǎn)的指針,
//如果大家看著這個(gè)不像指針的話,那就需要對(duì)指針有更深刻的了解
public
IntSLList(){
//定義一個(gè)空節(jié)點(diǎn)
head=tail=null;
}
public boolean
isEmpty(){
//判斷節(jié)點(diǎn)是否為空
return
head==null;
//這行代碼看起來似乎很神奇,其實(shí)真的很神奇,偶是服了
}
public void addToHead(int el){
//將el插入到頭結(jié)點(diǎn)前
head=new
IntNode(el,head);
//將節(jié)點(diǎn)插入到頭結(jié)點(diǎn)前,作為新的投節(jié)點(diǎn)
if(head==tail){
//給空鏈表插入節(jié)點(diǎn)時(shí)
tail=head;
//頭結(jié)點(diǎn)和尾結(jié)點(diǎn)指向同一個(gè)節(jié)點(diǎn)
}
}
public void addToTail(int
el){
//向鏈表的尾部增加結(jié)點(diǎn)
if(!isEmpty()){
//判斷鏈表是否為空
tail.next=new
IntNode(el);
//新建立一個(gè)值為el的節(jié)點(diǎn),將鏈表的尾結(jié)點(diǎn)指向新節(jié)點(diǎn)
tail=tail.next;
//更新尾指針的指向
}else{
head=tail=new
IntNode(el);
//如果鏈表為空,新建立一個(gè)節(jié)點(diǎn),將頭尾指針同時(shí)指向這個(gè)節(jié)點(diǎn)
}
}
public int
deleteFromHead(){
//刪除頭結(jié)點(diǎn),將節(jié)點(diǎn)信息返回
int
el=head.info;
//取出節(jié)點(diǎn)信息
if(head==tail){
//如果鏈表中只有一個(gè)節(jié)點(diǎn)
head=tail=null;
//刪除這一個(gè)節(jié)點(diǎn)
}else{
head=head.next;
//如果鏈表中不止一個(gè)節(jié)點(diǎn),將頭結(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)作為頭結(jié)點(diǎn)
}
return
el;
//返回原頭結(jié)點(diǎn)的值
}
public int
deleteFromTail(){
//刪除尾結(jié)點(diǎn),返回尾結(jié)點(diǎn)的信息
int
el=tail.info;
//取出尾結(jié)點(diǎn)的值
if(head==tail){
// 如果鏈表中只有一個(gè)節(jié)點(diǎn)
head=tail=null;
//刪除這個(gè)節(jié)點(diǎn)
}else{
IntNode
temp;
//定義中間變量
for(temp=head;temp.next!=tail;temp=temp.next);
//找出尾結(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),注意最后的分號(hào),
//這個(gè)for循環(huán)是沒有循環(huán)體的,目的在于找出尾結(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)
//在整個(gè)程序中用了很多次這樣的寫法,相當(dāng)經(jīng)典啊
tail=temp;
//將找出來的節(jié)點(diǎn)作為尾結(jié)點(diǎn),刪除原來的尾結(jié)點(diǎn)
tail.next=null;
//將新尾結(jié)點(diǎn)的指向設(shè)為空
}
return
el;
//返回原尾結(jié)點(diǎn)的信息
}
public void
printAll(){
//打印鏈表中所有節(jié)點(diǎn)的信息
if(isEmpty()){
//如果鏈表為空
System.out.println("This
list is
empty!");
//輸出提示信息
return;
//返回到調(diào)用的地方
}
if(head==tail){
//當(dāng)鏈表中只有一個(gè)節(jié)點(diǎn)時(shí)
System.out.println(head.info);
//輸出這個(gè)節(jié)點(diǎn)的信息,就是頭結(jié)點(diǎn)的信息
return;
}
IntNode
temp;
//定義一個(gè)中間變量
for(temp=head;temp!=null;temp=temp.next){
//遍歷整個(gè)鏈表
System.out.print(temp.info+"
");
//輸出每個(gè)節(jié)點(diǎn)的信息
}
System.out.println();
//輸出一個(gè)換行,可以沒有這一行
}
public boolean isInList(int
el){
//判斷el是否存在于鏈表中
IntNode
temp;
//定義一個(gè)中間變量
for(temp=head;temp!=null
temp.info!=el;temp=temp.next);
//將el找出來,注意最后的分
return
temp!=null;
// 如果存在返回true,否則返回flase,這兩行代碼很有思想
}
public void delete(int
el){
//刪除鏈表中值為el的節(jié)點(diǎn)
if(head.info==el
head==tail){
//如果只有一個(gè)節(jié)點(diǎn),并且節(jié)點(diǎn)的值為el
head=tail=null;
//刪除這個(gè)節(jié)點(diǎn)
}else
if(head.info==el){
// 不止一個(gè)節(jié)點(diǎn),而頭結(jié)點(diǎn)的值就是el
head=head.next;
//刪除頭結(jié)點(diǎn)
}else{
IntNode
pred,temp;
//定義兩個(gè)中間變量
for(pred=head,temp=head.next;temp.info!=el
temp.next!=null;pred=pred.next,temp=temp.next);
//跟上面的類似,自己琢磨吧,也是要注意最后的分號(hào)
pred.next=temp.next;
//將temp指向的節(jié)點(diǎn)刪除,最好畫一個(gè)鏈表的圖,有助于理解
if(temp==tail){
//如果temp指向的節(jié)點(diǎn)是尾結(jié)點(diǎn)
tail=pred;
//將pred指向的節(jié)點(diǎn)設(shè)為尾結(jié)點(diǎn),
}
}
}
//下面這個(gè)方法是在鏈表中值為el1的節(jié)點(diǎn)前面插入一個(gè)值為el2的節(jié)點(diǎn),
//用類似的思想可以再寫一個(gè)在鏈表中值為el1的節(jié)點(diǎn)后面插入一個(gè)值為el2的節(jié)點(diǎn)
public boolean insertToList(int el1,int
el2){
//定義一個(gè)插入節(jié)點(diǎn)的方法,插入成功返回true,否則返回false
IntNode
pred,temp; //定義兩個(gè)中間變量
if(isEmpty()){
//判斷鏈表是否為空
return
false;
//如果鏈表為空就直接返回false
}
if(head.info==el1
head==tail){
//如果鏈表中只有一個(gè)節(jié)點(diǎn),并且這個(gè)節(jié)點(diǎn)的值是el1
head=new
IntNode(el2,head);
//新建立一個(gè)節(jié)點(diǎn)
return
true;
}else if(head.info==el1){
IntNode t=new
IntNode(el2);
t.next=head;
head=t;
return
true;
}else{
for(pred=head,temp=head.next;temp!=null
temp.info!=el1;pred=pred.next,temp=temp.next);
if(temp!=null){
IntNode
a=new IntNode(el2);
pred.next=a;
a.next=temp;
return
true;
}else{
System.out.println(el1+"
NOT EXEISTS!");
return
false;
}
}
}
3.下面是測試代碼
public static void main(String[] args){
IntSLList test=new
IntSLList();
//test.addToHead(7);
test.addToTail(7);
System.out.println(test.insertToList(7,5));
test.printAll();
System.out.println(test.isInList(123));
}
}
/**
* 結(jié)點(diǎn)類
*/
private static class NodeT {
T nodeValue; // 數(shù)據(jù)域
NodeT next; // 指針域保存著下一節(jié)點(diǎn)的引用
Node(T nodeValue, NodeT next) {
this.nodeValue = nodeValue;
this.next = next;
}
Node(T nodeValue) {
this(nodeValue, null);
}
}
package OS;
public class IntNode
{
public String name;
//public int run_time=44;
public int run_time=(int)(Math.random()*100);
public IntNode next;
public int num;
public IntNode(int n,String n1){
this(n,n1,null);
}
public IntNode(int n,String n1,IntNode nn){
num=n;
name=n1;
next=nn;
}
}
package OS;
public class IntSLList
{
public IntNode head;//頭尾“指針”
public IntNode tail;
public IntSLList(){
head=tail=null;
}
//判別鏈表是否為空
public boolean isEmpty(){
return head==null;
}
//從鏈表頭部添加結(jié)點(diǎn)————此處的函數(shù)的傳遞參數(shù)是一個(gè)數(shù)值,也就是info
public void addToHead(IntNode some){
some.next=head;
head=some;
if(tail==null)
tail=head;
}
//從鏈表的尾部添加結(jié)點(diǎn)————同上
public void addToTail(IntNode some){
if(!isEmpty())
{
tail.next=some;
tail=tail.next;
}
else
head=tail=some;
}
//從鏈表頭開始刪除
public void deleteFromHead(){
if(head==tail)
head=tail=null;
else{
head=head.next;
}
}
}
單向鏈表
單向鏈表就是通過每個(gè)結(jié)點(diǎn)的指針指向下一個(gè)結(jié)點(diǎn)從而鏈接起來的結(jié)構(gòu)。
單向鏈表的初始化:這里我所講的鏈表都是頭結(jié)點(diǎn)不參與計(jì)算的,也就是說第一個(gè)結(jié)點(diǎn)都是頭結(jié)點(diǎn)后面的第一個(gè)結(jié)點(diǎn)。所以我要先申明一點(diǎn),這里我把鏈表的初始化放在了構(gòu)造函數(shù)部分,然后析構(gòu)函數(shù)負(fù)責(zé)釋放頭結(jié)點(diǎn)的內(nèi)存。
單向鏈表的創(chuàng)建過程:鏈表的創(chuàng)建就是添加結(jié)點(diǎn)到鏈表的最后,開始是添加一個(gè)結(jié)點(diǎn)到head結(jié)點(diǎn)后面,然后添加一個(gè)結(jié)點(diǎn)到上次添加的結(jié)點(diǎn)后面,每次新建的結(jié)點(diǎn)的指針總是指向NULL指針。從上面的示意圖可以看出,我們需要一個(gè)輔助指針一直指向最后一個(gè)結(jié)點(diǎn),這個(gè)輔助結(jié)點(diǎn)就是為了讓每次添加的結(jié)點(diǎn)都放置在最后一個(gè)位置。
單向鏈表插入結(jié)點(diǎn)過程:源代碼中的的插入結(jié)點(diǎn)函數(shù)我設(shè)置了一個(gè)指定位置,就是在指定位置插入結(jié)點(diǎn)。首先,通過位置變量position讓ptemp結(jié)點(diǎn)移動(dòng)到要插入位置的前一個(gè)位置,然后接下來的過程就是和創(chuàng)建鏈表的過程是一樣的,把新建的結(jié)點(diǎn)添加到ptemp的后面。這里變量position可以從1到鏈表長度加1,意思就是如果不算頭結(jié)點(diǎn)的話有3個(gè)結(jié)點(diǎn),那你的position變量就可以從1到4,這是因?yàn)閜temp指針可以到第3個(gè)結(jié)點(diǎn)的位置,所以新建結(jié)點(diǎn)的位置就可以到4了。
單向鏈表刪除結(jié)點(diǎn)過程:源代碼中的刪除結(jié)點(diǎn)函數(shù)也有一個(gè)指定位置變量,為了刪除指定位置的結(jié)點(diǎn)。和插入結(jié)點(diǎn)一樣通過變量position把ptemp移動(dòng)到要?jiǎng)h除結(jié)點(diǎn)的前一個(gè)位置,然后讓ptemp結(jié)點(diǎn)中的指針指向要?jiǎng)h除結(jié)點(diǎn)后面的一個(gè)結(jié)點(diǎn),也就是ptemp結(jié)點(diǎn)的下一個(gè)的下一個(gè)結(jié)點(diǎn),雖然這個(gè)結(jié)點(diǎn)可能為空,但是程序還是正常運(yùn)行。但是這里和插入結(jié)點(diǎn)不同的是變量position只能從1到鏈表的長度,是因?yàn)閜temp移動(dòng)到最后一個(gè)結(jié)點(diǎn)的時(shí)候,它的下一個(gè)結(jié)點(diǎn)為空,所以不不需要參與刪除了。
雙向鏈表
1.聽名字可能就能猜到雙向鏈表就是鏈表結(jié)點(diǎn)包含兩個(gè)指針,一個(gè)指針是指向下一個(gè)結(jié)點(diǎn)的,另一個(gè)指針當(dāng)然就是指向上一個(gè)結(jié)點(diǎn)的。
2.雙向鏈表的初始化:由于這里的鏈表頭結(jié)點(diǎn)不參與計(jì)算,所以頭結(jié)點(diǎn)的pPre指針是一直指向NULL指針的。
3.雙向鏈表的創(chuàng)建過程:由于雙向鏈表的每個(gè)結(jié)點(diǎn)包含兩個(gè)指針那么這個(gè)時(shí)候我們就要小心處理好每一個(gè)指針的指向,要不然會(huì)有很多意想不到的錯(cuò)誤。同樣的,和單向鏈表的創(chuàng)建過程一樣,需要一個(gè)輔助指針來指向最后一個(gè)結(jié)點(diǎn),然后每新建一個(gè)結(jié)點(diǎn),這個(gè)結(jié)點(diǎn)的pNext指針都是指向NULL指針的,pPre指針指向上一個(gè)結(jié)點(diǎn)(這是和單向鏈表不同的地方),然后讓上一個(gè)指針的pNext指向新建的結(jié)點(diǎn),這樣整個(gè)鏈表就連接起來了。
4.雙向鏈表插入結(jié)點(diǎn)過程:知道了雙向鏈表的創(chuàng)建過程,那么插入結(jié)點(diǎn)的過程就大同小異 了,有一點(diǎn)需要特別注意的就是這里的變量position范圍也是從1到鏈表長度加1,但是如果待插入的位置是最后一個(gè)位置的話,情況就不同了,看到下面的圖我們可以很好的理解,因?yàn)闆]新建一個(gè)結(jié)點(diǎn)的時(shí)候都需要處理兩個(gè)指針,而且新建結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)的pPre指針就需要指向這個(gè)新建的結(jié)點(diǎn),但是有可能這個(gè)新建的結(jié)點(diǎn)可能就已經(jīng)是最后一個(gè)結(jié)點(diǎn)了,那么這個(gè)時(shí)候再執(zhí)行
ptemp-pNext-pPre?=?pnew;
這條指令的時(shí)候就會(huì)報(bào)錯(cuò)了,因?yàn)閜temp-pNext已經(jīng)是個(gè)NULL指針了,那空指針哪里還有pPre呢。因此在程序中要進(jìn)行一次判斷,看看結(jié)點(diǎn)是否是最后一個(gè)結(jié)點(diǎn)。
5.雙向鏈表刪除結(jié)點(diǎn)的過程:要注意的問題和插入結(jié)點(diǎn)一樣,看看這個(gè)結(jié)點(diǎn)是否為NULL。這里就不重復(fù)了。
你的問題很好理解。但是你的代碼問題嚴(yán)重。
1、你想用java代碼實(shí)現(xiàn)還是c代碼實(shí)現(xiàn)?從你的代碼看是c語言
2、第一段代碼中的結(jié)構(gòu)體nod是不是應(yīng)該寫成Node?
3、inset函數(shù)中,鏈表L是有變化的,所以要用指針。結(jié)點(diǎn)s是不改變的,所以不應(yīng)該用指針
4、既然s不是用指針,后面的s-next自然也不能這么寫了。
public class Test {
public static void main(String[] args) {
try{
LinkList list1 = new LinkList();
LinkList list2 = new LinkList();
LinkList list3 = null;
list1.addAt(0, new Item(1, 5));
list1.addAt(1, new Item(-1.5, 3));
list1.addAt(2, new Item(1, 1));
list2.addAt(0, new Item(0.5, 5));
list2.addAt(1, new Item(0.5, 4));
list2.addAt(2, new Item(1.5, 3));
list2.addAt(3, new Item(3, 0));
list3 = mergeLinkList(list1, list2);
System.out.println("一元多項(xiàng)式的相加過程:");
list1.listAll();
System.out.println(" + ");
list2.listAll();
System.out.println(" = ");
list3.listAll();
}
catch(Exception e){
e.printStackTrace();
}
}
/**
* 一元多項(xiàng)式的一般項(xiàng)類
*/
class Item{
private double coef; ?//一元多項(xiàng)式的一般項(xiàng)的系數(shù)
private int exp; ? //一元多項(xiàng)式的一般項(xiàng)的指數(shù)
public Item(){
this.coef = 0.0;
this.exp = 0;
}
public Item(double coef, int exp){
this.coef = coef;
this.exp = exp;
}
public double getCoef(){
return this.coef;
}
public void setCoef(double coef){
this.coef = coef;
}
public int getExp(){
return this.exp;
}
public void setExp(int exp){
this.exp = exp;
}
}
/**
* 鏈表結(jié)點(diǎn)類
*/
class Node{
private Item data;
private Node next; ? //鏈表結(jié)點(diǎn)的指針域,指向直接后繼結(jié)點(diǎn)
public Node(){
data = null;
next = null;
}
public Node(Item data, Node next){
this.data = data;
this.next = next;
}
public Item getData(){
return this.data;
}
public void setData(Item data){
this.data = data;
}
public Node getNext(){
return this.next;
}
public void setNext(Node next){
this.next = next;
}
}
/**
* 鏈表類
*/
class LinkList{
private Node head = null; //頭結(jié)點(diǎn)指針
private int size = 0;
public LinkList(){
head = new Node();
size = 0;
}
//在i位置插入元素elem
public boolean addAt(int i, Item elem) {
if(i 0 || i size){
return false;
}
Node pre,curr;
int pos;
for(pre=head; i0 pre.getNext()!=null; i--,pre=pre.getNext());
curr = new Node(elem, pre.getNext());
pre.setNext(curr);
size++;
return true;
}
//刪除i位置的元素
public boolean removeAt(int i) {
if(i 0 || i = size){
return false;
}
Node pre,curr;
for(pre=head; i0 pre.getNext()!=null; i--,pre=pre.getNext());
curr = pre.getNext();
pre.setNext(curr.getNext());
size--;
return true;
}
java是一種可以撰寫跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言。Java?技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開發(fā)者專業(yè)社群。