14、剑指offer--链表中倒数第k个结点
生活随笔
收集整理的這篇文章主要介紹了
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个结点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pandas 数据分析使用
- 下一篇: ShellCode入门(提取ShellC