日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

14、剑指offer--链表中倒数第k个结点

發布時間:2024/9/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 14、剑指offer--链表中倒数第k个结点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述 輸入一個鏈表,輸出該鏈表中倒數第k個結點。 解題思路: 方法一: 定義兩個指針,一個指針先向前移動k-1步(在移動過程中判斷是否越界) 第二個指針指向頭,然后兩個指針同時向前移動,第一個指針指向最后一個節點的時候,第二個指針指向第k個結點 方法二:先全部遍歷一遍,找到鏈表中結點數目,然后進行k和結點數目length的比較,把特殊錯誤的情況處理出來,然后再用一中的方法用兩個指針,找到倒數第k個結點。 1 #include <iostream> 2 #include <malloc.h> 3 using namespace std; 4 struct ListNode { 5 int val; 6 struct ListNode *next; 7 ListNode(int x) : 8 val(x), next(NULL) { 9 } 10 }; 11 ListNode *CreateList(int n) 12 { 13 ListNode *head; 14 ListNode *p,*pre; 15 int i; 16 head=(ListNode *)malloc(sizeof(ListNode)); 17 head->next=NULL; 18 pre=head; 19 for(i=1;i<=n;i++) 20 { 21 p=(ListNode *)malloc(sizeof(ListNode)); 22 cin>>p->val; 23 pre->next=p; 24 pre=p; 25 } 26 p->next=NULL; 27 28 return head->next; 29 } 30 /*-------------------------輸出鏈表-----------------------------------*/ 31 void PrintList(ListNode *h) 32 { 33 ListNode *p; 34 35 p=h;//不帶空的頭結點 36 while(p) 37 { 38 cout<<p->val<<" "; 39 p=p->next; 40 cout<<endl; 41 } 42 } 43 class Solution { 44 public: 45 ListNode* FindKthToTail1(ListNode* pListHead, unsigned int k) { 46 if(pListHead == NULL || k == 0) 47 return NULL; 48 ListNode *pHead = pListHead; 49 ListNode *pBehind = NULL; 50 for(int i=0;i<k-1;i++) 51 { 52 if(pHead->next!=NULL) 53 { 54 pHead = pHead->next; 55 } 56 else 57 { 58 return NULL; 59 } 60 } 61 pBehind = pListHead;//當pHead指向鏈表第k-1和節點是,pBehind指向鏈表的頭 62 while(pHead->next!=NULL) 63 { 64 pHead = pHead->next; 65 pBehind = pBehind->next; 66 } 67 return pBehind; 68 } 69 ListNode* FindKthToTail2(ListNode* pListHead, unsigned int k) { 70 if(pListHead == NULL || k<=0) 71 return NULL; 72 int length = 0; 73 ListNode *pNode = pListHead; 74 while(pNode != NULL) 75 { 76 pNode = pNode->next; 77 length++; 78 } 79 if(k == length) 80 return pListHead; 81 else if(k>length) 82 return NULL; 83 else//取k%length 84 { 85 ListNode *p1 = pListHead; 86 ListNode *p2 = pListHead; 87 for(int i=0;i<(k-1)%length;i++) 88 { 89 p2 = p2->next; 90 } 91 while(p2->next != NULL) 92 { 93 p1 = p1->next; 94 p2 = p2->next; 95 } 96 return p1; 97 } 98 99 } 100 }; 101 int main() 102 { 103 int n1; 104 int k; 105 ListNode *h1; 106 cout<<"輸入鏈表1的結點數目"<<endl; 107 cin>>n1; 108 h1 = CreateList(n1); 109 cout<<"鏈表1為:"<<endl; 110 PrintList(h1); 111 cout<<"輸入需要的k"<<endl; 112 cin>>k; 113 Solution s; 114 cout<<"方法一:倒數第"<<k<<"個結點的值為"<<endl; 115 cout<<s.FindKthToTail1(h1,k)->val<<endl; 116 cout<<"方法二:倒數第"<<k<<"個結點的值為"<<endl; 117 cout<<s.FindKthToTail2(h1,k)->val<<endl; 118 return 0; 119 }

轉載于:https://www.cnblogs.com/qqky/p/6858438.html

總結

以上是生活随笔為你收集整理的14、剑指offer--链表中倒数第k个结点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。