1. 程式人生 > 其它 >力扣_連結串列

力扣_連結串列

刪除連結串列中的節點

/** *Definitionforsingly-linkedlist. *publicclassListNode{ *intval; *ListNodenext; *ListNode(intx){val=x;} *} */ //刪除node節點 //先將node節點的值程式設計node節點後面的值 //再將node節點的指向由其下一個變成它的下下一個 //總之就是將node節點的下一個元素的值和指向變成node的 classSolution{ publicvoiddeleteNode(ListNodenode){ node.val=node.next.val; node.next=node.next.next;
} }

刪除連結串列的倒數第N個節點

/** *Definitionforsingly-linkedlist. *publicclassListNode{ *intval; *ListNodenext; *ListNode(){} *ListNode(intval){this.val=val;} *ListNode(intval,ListNodenext){this.val=val;this.next=next;} *} */ //刪除倒數第n個節點,首先要判斷n與連結串列的長度大小 //如果n比連結串列長度大則返回null //如果n比連結串列長度小,則刪除的是正數(連結串列長度-n+1)個節點 classSolution{
publicListNoderemoveNthFromEnd(ListNodehead,intn){ ListNodebefore=newListNode(0,head); //求連結串列的長度 intlength=Length(before); ListNodeafter=before; for(inti=1;i<length-n+1;i++){ after=after.next; } after.next=after.next.next; returnbefore.next; } //求連結串列的長度 publicintLength(ListNodenode){ intlength=0; node=node.next;
while(node!=null){ node=node.next; length++; } returnlength; } }

反轉連結串列

/** *Definitionforsingly-linkedlist. *publicclassListNode{ *intval; *ListNodenext; *ListNode(){} *ListNode(intval){this.val=val;} *ListNode(intval,ListNodenext){this.val=val;this.next=next;} *} */ //結合頭插法的方式 //讓連結串列的第一個節點指向新設的空指標節點 //讓空指標節點指向第一個節點 //第二個節點指向第一個節點 //迴圈往復
classSolution{ publicListNodereverseList(ListNodehead){ ListNoderev=null; ListNodenode=head; while(node!=null){ ListNodenext=node.next; node.next=rev; rev=node; node=next; } returnrev; } }

合併兩個有序連結串列

/** *Definitionforsingly-linkedlist. *publicclassListNode{ *intval; *ListNodenext; *ListNode(){} *ListNode(intval){this.val=val;} *ListNode(intval,ListNodenext){this.val=val;this.next=next;} *} */ //設定一個指標用於最後返回頭節點用 //設定另外一個指標用於儲存過程中的值 //儲存過程中一直比較list1和list2節點值的大小,小的儲存下來,並且指標向後移動 //最後將未儲存下來的資料儲存下來 classSolution{ publicListNodemergeTwoLists(ListNodelist1,ListNodelist2){ //設定哨兵節點 ListNodeln1=newListNode(-1); //過程儲存值節點 ListNodeln2=ln1; while(list1!=null&&list2!=null){ if(list1.val<=list2.val){ ln2.next=list1; list1=list1.next; }else{ ln2.next=list2; list2=list2.next; } ln2=ln2.next; } if(list1==null){ ln2.next=list2; }else{ ln2.next=list1; } returnln1.next; } }

迴文連結串列

/** *Definitionforsingly-linkedlist. *publicclassListNode{ *intval; *ListNodenext; *ListNode(){} *ListNode(intval){this.val=val;} *ListNode(intval,ListNodenext){this.val=val;this.next=next;} *} */ //先用一個List儲存連結串列中的元素 //然後設定一個頭結點和末尾節點用用於判斷該連結串列是不是對稱的 //直到到達中間為止 classSolution{ publicbooleanisPalindrome(ListNodehead){ //設定List儲存連結串列中的元素 List<Integer>list=newArrayList<Integer>(); while(head!=null){ list.add(head.val); head=head.next; } //設定頭節點和末尾節點 intstart=0; intend=list.size()-1; while(start<end){ if(list.get(start)!=list.get(end)){ returnfalse; } start++; end--; } returntrue; } }

環形連結串列

/** *Definitionforsingly-linkedlist. *classListNode{ *intval; *ListNodenext; *ListNode(intx){ *val=x; *next=null; *} *} */ //這題可以用set集合 //因為set集合不能存相同的值 publicclassSolution{ publicbooleanhasCycle(ListNodehead){ //設定set用於存節點 Set<ListNode>set=newHashSet<ListNode>(); //順序存入連結串列節點,如果中間遇到重複的直接返回true,代表是迴圈連結串列 while(head!=null){ //存入返回true,否則返回false if(!set.add(head)){ returntrue; } head=head.next; } returnfalse; } }