单链表逆置 java_单链表的就地逆置--java实现(含头节点和不包含头节点)
前沿:鏈表是面試中經(jīng)常問道的知識點,比如鏈表反轉(zhuǎn),就地反轉(zhuǎn),判斷單鏈表是否相交,判斷鏈表是否有環(huán)等都是常問的問題.今天說一下單鏈表就地反轉(zhuǎn).
本文從包含頭節(jié)點和不包含頭節(jié)點兩種鏈表都提供了相應的就地反轉(zhuǎn)方案:
頭節(jié)點:數(shù)據(jù)結(jié)構中,在單鏈表的開始結(jié)點之前附設一個類型相同的結(jié)點,稱之為頭結(jié)點。頭結(jié)點的數(shù)據(jù)域可以不存儲任何信息,頭結(jié)點的指針域存儲指向開始結(jié)點的指針(即第一個元素結(jié)點的存儲位置)。
作用: 是為了方便單鏈表的特殊操作,比如插入,刪除等操作在鏈表在鏈表為null時操作具有特殊性.而使用了頭節(jié)點后就保持了單鏈表操作的統(tǒng)一性!
包含頭節(jié)點實現(xiàn)就地反轉(zhuǎn)
思路:1.如果頭節(jié)點為空,或者只有頭節(jié)點或者只有頭節(jié)點以及一個后繼節(jié)點.這不需要反轉(zhuǎn),
2.如果有兩個以上的節(jié)點通過一個cur指針指向二個節(jié)點,并將第一個節(jié)點的next指向null
3.如果cur節(jié)點不為null,通過另一個temp指針指向cur節(jié)點的的next節(jié)點,(由于后面cur節(jié)點的next需要變化所以先保存下來)
4.將cur節(jié)點的next指向當前的第一個節(jié)點(也就是head的next節(jié)點)
5.將head節(jié)點的next節(jié)點指向cur節(jié)點.
6.設置cur節(jié)點為temp節(jié)點.從3開始循環(huán)
public static void reverse(Node head){
//步驟1
if (head==null||head.next==null||head.next.next==null){
return;
}
//步驟2
Node cur=head.next.next;
head.next.next=null;
while (cur!=null){
//步驟3
Node temp=cur.next;
//步驟4
cur.next=head.next;
//步驟5
head.next=cur;
//步驟6
cur=temp;
}
}
關于以上的主要思想其實就是:
當除了頭節(jié)點外,沒有其他節(jié)點或者只有一個節(jié)點時,鏈表不需要反轉(zhuǎn).
通過三個指針輔助執(zhí)行整個反轉(zhuǎn)過程,head用于指向頭節(jié)點,cur指向當前節(jié)點,temp用于指向cur的next節(jié)點.
將第一個節(jié)點(非head)的next指向null,因為在反轉(zhuǎn)之后它為最后一個節(jié)點
將cur節(jié)點不斷的插入到head和第一個節(jié)點之間,并將cur指針指向temp不斷推進.
不包含頭節(jié)點實現(xiàn)就地反轉(zhuǎn)
private static Node revert(Node head) {
if (head == null || head.nextNode == null) {
// 到達尾結(jié)點
return head;
}
// 一直入棧
Node revertHead = revert(head.nextNode);
// 出棧并賦值nextNode對象
head.nextNode.nextNode = head;
head.nextNode = null;
// 返回尾結(jié)點(逆置后的頭結(jié)點)
return revertHead;
}
1.通過遞歸的方式找到尾節(jié)點(也就是反轉(zhuǎn)后的頭節(jié)點)
2.從文件尾節(jié)點開始反向遍歷,每次都將自己的下一個節(jié)點指向自己,并將字節(jié)的next指向null.
總結(jié)
以上是生活随笔為你收集整理的单链表逆置 java_单链表的就地逆置--java实现(含头节点和不包含头节点)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java数组的调用_java中数组的应用
- 下一篇: java txt 写入_JAVA 写入T