16.單連結清單介紹和記憶體布局;連結清單(Linked List),有帶頭結點和不帶頭結點之分;鍊式存儲,每個結點的位置不确定

17.單向連結清單的建立和周遊的分析實作
單連結清單建立示意圖(添加),周遊分析:
class Node結構:
單連結清單用一個類來實作class singleLinkedList,将一個個的Node對象通過next,在邏輯上相連
head節點private不能動,是以需要輔助變量temp幫助周遊
初始化一個頭結點,private head = new Node(0,"","");
temp.next==空時,連結清單到末尾
添加節點到單向連結清單(未考慮添加編号順序問題)
周遊單向連結清單
18.單連結清單順序加入節點,可以在記憶體中就将資料排好序
思路:先找到添加節點的位置,通過輔助變量(指針);新的節點next=temp.next;将temp.next=新的節點
單連結清單addByOrder方法:
因為單連結清單是單向的,是以temp是位于插入位置前的節點
通過flag判斷添加的編号是否已經存在
若不存在,則添加,新的節點next=temp.next;将temp.next=新的節點
19.單連結清單的修改update
判斷節點是都找到:
通過編号no,找到需要修改的節點
temp=head.next head不參與修改
flag=false 判斷被修改節點是否存在
temp==null(因為temp=head.next) 判斷是否已在連結清單末尾,是則break退出循環
temp.no==newNode.no 判斷編号是否一緻,一緻則flag=true,break修改節點
上兩個條件不滿足則,temp=temp.next,繼續判斷下一個節點
對節點修改:
如果flag=true,修改節點資訊
否則,提示目前編号節點未找到
20.單連結清單節點的删除
思路:找到被删除節點的前一個節點temp;temp.next=temp.next.next;被删除節點沒有其他引用指向,被GC回收
實作:
head不能動,要一個輔助節點找到待删除節點的前一個節點
temp.next.no與要删除節點的no進行比較,初始:temp=head
flag=false 标志是否找到待删除節點
(判斷)temp.next==null,已到連結清單末尾,break
(判斷)temp.next.no==no,找到要删除的節點的前一個節點,flag=true,break
temp=temp.next,繼續往下周遊連結清單
flag==true,删除temp.next節點,temp.next=temp.next.next
21.單連結清單面試題
統計單連結清單中有效節點的個數:
思路:
getLength方法,return連結清單長度length
将head作為參數傳入getLength方法
驗證連結清單是否為空,為空結束
用一個輔助變量,cur=head.next即不統計頭結點,開始周遊
length++,cur=cur.next
return length
查找單連結清單中倒數第k個節點(新浪面試題)
編寫一個方法,接收一個head和index=k,return 第k個節點
先周遊一遍連結清單,得到連結清單的長度size
index表示倒數第index個元素
再将連結清單周遊,輸出第size-index個元素
22.單連結清單的反轉(騰訊面試)
定義一個新節點reverseHead作為翻轉連結清單的頭
将原始連結清單從頭開始周遊,每取出一個元素node,就将元素放于reverseLinkedList的第一個位置,即node.next=reverseHead.next,reverseHead.next=node (因為需要從初始連結清單取資料,是以需要一個額外的變量next指向當初始連結清單的下一個要取的元素)
将原始連結清單周遊完後,原始連結清單的頭指針指向翻轉連結清單的第一個元素,head.next=reverseHead.next
23.從尾到頭列印單連結清單,要求方式1:反向周遊(破壞連結清單結構,不建議使用),方式2:Stack棧(百度面試)
棧的基本使用:
練習:合并兩個有序的單連結清單,合并之後的連結清單依然有序
建立一個新的newHead節點,作為合并後的連結清單表頭
取單連結清單資料時進行判斷,哪個更小/更大,則加傳入連結表尾部/第一個位置