1. 程式人生 > 其它 >連結串列面試題

連結串列面試題

/**
*獲取到單鏈表的節點的個數
* @param head
* @return 返回的就說有效節點的個數
*/

public static int getLength(HeroNode head){
if (head.next == null) {
return 0;//帶頭結點的空連結串列 不要統計頭節點重要
}
int length=0;
HeroNode temp = head.next;//臨時的要定義成next
while (temp != null) {
length++;
temp=temp.next;

}
return length;

}

System.out.println(getLength(singleLinkedList.getHead())+"返回的有效節點個數");

3 返回的有效節點個數

----------------------------------------------------------------------------------------------------------------
/**
* 查詢單鏈表中倒數第K個節點
* 接受head節點 ,同時接受一個index
* index:表示是倒數第index個節點
* 先把連結串列從頭到尾遍歷,得到連結串列的總的長度 (getlengh就行)

* 得到size後,從連結串列的第一個開始遍歷(size-index)個,就可以得到
*/
public static HeroNode findLastIndexNode(HeroNode head,int index){
//如果連結串列為空 ,返回null
if (head.next == null) {
return null;//沒有找到
}
//第一個遍歷得到連結串列的長度(節點個數)
int length = getLength(head);
HeroNode temp = head.next;//輔助變數指向第一個變數,而不是頭節點
//第二次白遍歷 size-index位置,就說我們倒數的第k個節點

if (index <= 0 || index > length) {
return null;
}
for (int i = 0; i <length-index; i++) {
temp=temp.next;//三個節點 ,遍歷兩次
}
return temp;

}

HeroNode heroNode = findLastIndexNode(singleLinkedList.getHead(),2);
System.out.println(heroNode);

 HeroNode{no=3, name='吳用', nickName='智多星'}


----------------------------------------------------------------------------------------------------------------



連結串列反轉思路

原連結串列head.next獲取,然後連線到下面得reverseHead節點 , temp連線上下一個節點

資料5拿出來指向資料二,連線到reversehead節點後面,

把便利的最後一個放到5之前,reverseHead後面 ,同時9.next不為空,變為5 ,同時head指向9(reverseHead的下一個節點)


/**
* 單鏈表的反轉
* 1.先定義一個節點 reverseHead = new HeroNode();
* 2.從頭到位遍歷原來的連結串列,沒遍歷一個節點,就將其取出,並放在新的連結串列的最前端
* 3.原來的連結串列的head.next = reverseHead.next
*/
public static void resersetList(HeroNode head){
//如果當前連結串列為空,或者只有一個節點,無需反轉,直接返回
if(head.next==null||head.next.next==null){
return;
}//定義一個輔助指標 都是第一個節點開始
HeroNode temp = head.next;
//防止連結串列斷裂,需要定一個next.next記錄
HeroNode next = null;
HeroNode reverseHead = new HeroNode(0,"","");
//並從頭開始遍歷原先連結串列
while (temp!=null){//temp不為空才迴圈
next=temp.next;//保留當前節點的下一個節點 5的下一個節點是2
// reverseHead.next=temp;
temp.next=reverseHead.next;//將temp的下一個節點指向新的連結串列的最前端 本來是re.next指向5,現在給到9
reverseHead.next=temp;//將temp連線到新的連結串列上
temp = next;//temp後移
//實現單鏈表反轉
head.next=reverseHead.next;//最後把re.next直接給head.next

}
}