從尾到頭打印鏈表
輸入一個鏈表的頭節點,從尾到頭反過來返回每個節點的值(用數組返回)
題目解讀:題目的大致意思鏈表是單向的,例如鏈表數值是 1,2,3,4,5,6
解題思路:我們需要可以反向輸出為6,5,4,3,2,1 很明顯我們通過鏈表是無法反向輸出因為他是單向的,所有考慮例如棧的結構,存儲數值,然后利用棧的特性,先進先出,也就是逐個遍歷鏈表,一一入棧,然后在將一一出棧,每次都去獲取棧頂,將其放入vector中下面是具體的代碼實現
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
stack <int> s;
while (head != NULL) {
s.push(head->val);
head = head->next;
}
vector <int> vec;
while (!s.empty()) {
vec.push_back(s.top());
s.pop();
}
return vec;
}
};
鏈表中倒數第k個節點
輸入一個鏈表,輸出該鏈表中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鏈表的尾節點是倒數第1個節點。例如,一個鏈表有6個節點,從頭節點開始,它們的值依次是1、2、3、4、5、6。這個鏈表的倒數第3個節點是值為4的節點。
題目解讀:由于鏈表是單向的,所以你無法知道距離末尾節點,倒數的節點,這時候需要通過一個輔助節點來幫你,節點1先向后移動指向到正著數第k個節點,然后跟著節點2指向頭節點,節點1和節點2一起像后移動,則當節點指向尾節點時,節點2指向的是倒數第k個節點
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode* p = head;
ListNode* p1 = head;
int j = 0;
while (p != NULL) {
if (j < k) {
j++;
} else {
p1 = p1->next;
}
p = p->next;
}
return p1;
}
};
反轉鏈表
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
解題思路:反轉鏈表需要需要節點cur記錄當前節點, 一個節點pre記錄上一個節點,所以當cur->next = pre 這時候就實現了反轉了,當這時候也需要一個臨時變量使cur節點可以向后移動,則先用temp = cur->next, 可以看看具體的代碼實現
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *cur = head;
ListNode *pre = NULL;
ListNode *temp = NULL;
while (cur != NULL) {
temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
最后這里return pre是以為當前節點cur = temp 跳出循環這時候 cur 指向了null,也就是尾節點多向后移動了一位,pre 是 cur的上一個節點才是真正的最后一位所以return pre;