Java 八道經典面試題之鏈表題
第一題 移除鏈表元素
給你一個鏈表的頭節(jié)點 head 和一個整數 val ,請你刪除鏈表中所有滿足 Node.val == val 的節(jié)點,并返回 新的頭節(jié)點 。

輸入:head = [1,2,6,3,4,5,6], val = 6
輸出:[1,2,3,4,5]
這道題還是比較簡單的我們需要讓刪除的節(jié)點的前一個結點指向刪除節(jié)點的后一個就行。就比如cur.next==cur.next.next;。
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode header=new ListNode(-1);
header.next=head;
ListNode cur =header;
while(cur.next!=null){
if(cur.next.val==val){
cur.next=cur.next.next;
}else{
cur=cur.next;
}
}
return header.next;
}
}
第二題 反轉鏈表
給你單鏈表的頭節(jié)點 head ,請你反轉鏈表,并返回反轉后的鏈表。

輸入:head = [1,2,3,4,5]
輸出:[5,4,3,2,1]
這也是一個簡單題,我們還是先弄一個尾結點,因為鏈表的最后一個結點的下一個是一個null,這道題我們可以通過一次循環(huán)讓后一個結點的下一個結點指向前一個結點。
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre =null;
ListNode cur=head;
while(cur!=null){
ListNode next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
return pre;
}
}
第三題 鏈表的中心結點
給定一個頭結點為 head 的非空單鏈表,返回鏈表的中間結點。
如果有兩個中間結點,則返回第二個中間結點。
答:這個也是一個簡單題我們需要用到快慢指針,當快指針指完之后,慢的結點肯定是中點比如18 快的可以走9步每次走兩步走到18,慢的可以每次走一部走9步。剛好到中點。
class Solution {
public ListNode middleNode(ListNode head) {
ListNode p =head;
ListNode q =head;
while(q!=null&&q.next!=null){
q=q.next.next;
p=p.next;
}
return p;
}
}
第四題 倒數第k個結點
輸入一個鏈表,輸出該鏈表中倒數第k個結點
輸入:
1,{1,2,3,4,5}
復制
返回值:
{5}
答:這道題也是一個簡單題,直接簡單粗暴的搞出來倒數第k個點的值就行;
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ListNode cur=head;
ListNode pre=head;
int count=0;
int x=0;
while(cur!=null){
cur=cur.next;
count++;
}
if(k<0||k>count){
return null;
}
while(pre!=null){
if(x==count-k){
break;
}else{
pre=pre.next;
x++;
}
}
return pre;
}
}
這道題寫的有點麻煩了,我們也可以用快慢指針做。一個指針走5步一個走4步。
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ListNode p=head;
ListNode q=head;
for(int i = 0; i < k; i++) {
if (p != null) {
p= p.next;
} else {
return null;
}
}
while(p!=null){
p=p.next;
q=q.next;
}
return q;
}
}
第五題 合并兩個有序鏈表
將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節(jié)點組成的。

輸入:l1 = [1,2,4], l2 = [1,3,4]
輸出:[1,1,2,3,4,4]
答:這道題考到了怎么將兩個鏈表合并,我們需要將兩個鏈表從大到小合并起來。
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode cur = dummyHead;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
cur.next = l1;
cur = cur.next;
l1 = l1.next;
} else {
cur.next = l2;
cur = cur.next;
l2 = l2.next;
}
}
// 任一為空,直接連接另一條鏈表
if (l1 == null) {
cur.next = l2;
} else {
cur.next = l1;
}
return dummyHead.next;
}
}
第六題 鏈表分割
現有一鏈表的頭指針 ListNode* pHead,給一定值x,編寫一段代碼將所有小于x的結點排在其余結點之前,且不能改變原來的數據順序,返回重新排列后的鏈表的頭指針。
輸入:l1 = [1,2,1,3,2] 3
輸出:[1,2,1,2,3]
這道題比較難了需要我們創(chuàng)建兩個鏈表,一個數大與等于x的鏈表,另一個數小于x的鏈表。然后讓上一個鏈表的下一個尾結點指向下一個結點的尾巴結點。
這里我們需要用到如何將兩個鏈表合并成一個鏈表。
做題的時候先想怎么做然后在動手!
public class Partition {
public ListNode partition(ListNode pHead, int x) {
if(pHead == null || pHead.next == null) {
return pHead;
}
ListNode newHead = new ListNode(0);
ListNode flagHead = new ListNode(0);
ListNode newh = newHead;
ListNode flagh = flagHead;
while(pHead != null){
if(pHead.val < x){
newh.next = new ListNode(pHead.val);
newh = newh.next;
}else{
flagh.next = new ListNode(pHead.val);
flagh = flagh.next;
}
pHead = pHead.next;
}
newh.next = flagHead.next;
return newHead.next;
}
}
第七題 判斷是否回文
對于一個鏈表,請設計一個時間復雜度為O(n),額外空間復雜度為O(1)的算法,判斷其是否為回文結構。
給定一個鏈表的頭指針A,請返回一個bool值,代表其是否為回文結構。保證鏈表長度小于等于900。
1->2->2->1
返回:true
public class PalindromeList {
public boolean chkPalindrome(ListNode head) {
// write code here
ListNode fast=head;
ListNode slow=head;
while(fast!=null && fast.next!=null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode cur=slow.next;
while(cur!=null){
ListNode curNext=cur.next;
cur.next=slow;
slow=cur;
cur=curNext;
}
//3.一個從前往后,一個從后往前 如果相遇,則證明回文
while(head!=slow){
if(head.val!=slow.val){//先判斷值是否相等
return false;
}
if(head.next==slow){//偶數情況下
return true;
}
head=head.next;
slow=slow.next;
}
return true;
}
第八題 相交鏈表
給你兩個單鏈表的頭節(jié)點 headA 和 headB ,請你找出并返回兩個單鏈表相交的起始節(jié)點。如果兩個鏈表不存在相交節(jié)點,返回 null 。

可以用笨方法就是計算出來每個鏈表的個數然后讓多的先走。
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
ListNode last = headB;
while (last.next != null) {
last = last.next;
}
last.next = headB;
ListNode fast = headA;
ListNode slow = headA;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
slow = headA;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
last.next = null;
return fast;
}
}
last.next = null;
return null;
}
}
到此這篇關于Java 八道經典面試題之鏈表題的文章就介紹到這了,更多相關Java 鏈表題內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot使用RestTemplate調用第三方接口的操作代碼
這篇文章主要介紹了Springboot使用RestTemplate調用第三方接口,我只演示了最常使用的請求方式get、post的簡單使用方法,當然RestTemplate的功能還有很多,感興趣的朋友可以參考RestTemplate源碼2022-12-12
基于HTML5+js+Java實現單文件文件上傳到服務器功能
應公司要求,在HTML5頁面上實現上傳文件到服務器功能,對于我這樣的菜鳥,真是把我難住了,最后還是請教大神搞定的,下面小編把例子分享到腳本之家平臺,供大家參考2017-08-08

