1. **中指明了鍊錶的定義,以及初始化,初始化使用尾插法實現。
2. 鍊錶的翻轉採用三種方式,分別是遞迴,棧,以及對鍊錶逆序後,再輸出
**如下:
#include #includeusing namespace std;
typedef struct nodenode;
//尾部新增
node* tailadd(node* head, int e)else if(head ->next == null)else
p->next = t;
}return head;
}//順序輸出
void print(node* head)
coutcout}
}//棧,實現逆序
void reverseprint(node* head)
while(!s.empty())
coutnode* p1 = head; //p1儲存翻轉後的鍊錶
node* p2 = head->next; //p2儲存原始鍊錶
node* p3 = null; //臨時儲存結點
head->next = null; //phead的第乙個結點是尾結點,尾結點下乙個結點是null;
while(p2!=null)
head = p1; //把p1賦值給頭結點head。
return head;
}int main()
print(head); //順序輸出鍊錶
dg(head); //翻轉遞迴輸出
reverseprint(head); //棧翻轉輸出
head = revers(head); //先將鍊錶逆序返回
print(head); //再把逆序的鍊錶輸出
return 0;
}
node* merge(node* phead1, node* phead2)
else if(phead1==null)else if(phead2 == null)elseelse
phead1 = p;
while(p1!=null && p2!=null)else
}if(p1!=null)else if(p2!=null)else
return phead1;
}}
有兩種方法:
1. 先遍歷鍊錶,算出鍊錶結點數count,第二次直接遍歷到第count-k個結點。但是要注意,可能鍊錶結點數cout小於k,此時要返回null。這一條件要先判斷。
**:
node* findkthtotail(node* plisthead, unsigned int k) else
}node* r =new node;
r = null;
if(countnext;
}r = p;
return r;
}}
2. 可以用兩個指標,第乙個指標遍歷到第k個結點的時候,第二個指標再走到第乙個結點,兩個指標之間始終保持k-1的距離,當第乙個指標的next==null,第二個指標對應的位置,就是倒數第k個結點。
node* findkthtotail(node* plisthead, unsigned int k) else
first = first->next;
}if(count}
}
鍊錶倒數第k個節點
兩個指標一前一後,相距k即可。include include using namespace std struct linknode typedef linknode linklist void insertlist linklist list int data else linknode rese...
鍊錶 倒數第k個節點
問題 刪除倒數第k個節點 鏈結 雙指標法,開始時p1,p2都指向頭節點,先讓p2走k步,然後p1和p2一起走,當p2指向null時,p1就指向倒數第k個節點了 definition for singly linked list.struct listnode class solution retur...
鍊錶2 鍊錶中倒數第k個結點
題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。k從1開始 思路 所謂輸入乙個鍊錶是指輸入乙個頭結點這個輸入的結點必然是含有next指標的物件,於是之後的多個結點相互連線形成乙個鍊錶。倒數第k個結點,也就正數第k n 1個結點,只需要遍歷鍊錶,返回第k n 1個結點即可 但是此時由於n是不知道的,為...