Skip to content

Commit 8a4eb1b

Browse files
authored
Merge pull request #2 from wangzheng0822/master
merge to my fork
2 parents 79e2a3f + b1244bb commit 8a4eb1b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+2414
-2
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,6 @@
2121

2222
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
2323
hs_err_pid*
24+
25+
# editor files
26+
.vscode

c-cpp/.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# main files
2+
main.*
3+
4+
# executives
5+
a.out
6+
7+
# objective files
8+
*.o
9+
*.obj
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
/**
2+
* Author: TripleZ<[email protected]>
3+
* Date: 2018-10-10
4+
* Brief: Linked list class.
5+
*/
6+
7+
#ifndef _LINKEDLIST_HPP_
8+
#define _LINKEDLIST_HPP_
9+
10+
#include <cstdio>
11+
#include "ListNode.hpp"
12+
13+
class LinkedList {
14+
public:
15+
int size;
16+
int length;
17+
ListNode *head;
18+
LinkedList();
19+
LinkedList(int size);
20+
~LinkedList();
21+
ListNode* FindElem(int elemVal);
22+
bool DeleteElem(ListNode *elem);
23+
bool DeleteLastElem();
24+
bool InsertElemAtFront(int elemVal);
25+
bool InsertElemAtBack(int elemVal);
26+
void PrintList();
27+
};
28+
29+
LinkedList::LinkedList() {
30+
this -> head = new ListNode();
31+
this -> head->next = nullptr;
32+
this -> head->val = -1;
33+
this -> size = 10; // default
34+
this -> length = 0;
35+
}
36+
37+
LinkedList::LinkedList(int size) {
38+
this -> head = new ListNode();
39+
this -> head->next = nullptr;
40+
this -> head->val = -1;
41+
42+
this -> size = size;
43+
this -> length = 0;
44+
}
45+
46+
LinkedList::~LinkedList() {
47+
ListNode *p, *q;
48+
p = this -> head;
49+
while(p -> next != nullptr) {
50+
q = p -> next;
51+
p -> next = p -> next -> next;
52+
delete q;
53+
}
54+
delete head;
55+
this -> head = nullptr;
56+
this -> length = 0;
57+
}
58+
59+
ListNode* LinkedList::FindElem(int elemVal) {
60+
ListNode *p;
61+
for (p = this -> head; p != nullptr; p = p -> next) {
62+
if (p -> val == elemVal) {
63+
return p;
64+
}
65+
}
66+
return nullptr;
67+
}
68+
69+
bool LinkedList::DeleteElem(ListNode *elem) {
70+
ListNode *prev, *next;
71+
for (prev = this -> head; prev -> next != elem; prev = prev -> next);
72+
next = elem -> next;
73+
prev -> next = next;
74+
delete elem;
75+
this -> length --;
76+
return true;
77+
}
78+
79+
bool LinkedList::DeleteLastElem() {
80+
ListNode *prev, *elem;
81+
for (prev = this -> head; prev -> next -> next != nullptr; prev = prev -> next) ;
82+
elem = prev -> next;
83+
prev -> next = nullptr;
84+
delete elem;
85+
this -> length --;
86+
return true;
87+
}
88+
89+
bool LinkedList::InsertElemAtFront(int elemVal) {
90+
ListNode *newNode = new ListNode();
91+
newNode -> val = elemVal;
92+
newNode -> next = this -> head -> next;
93+
this -> head -> next = newNode;
94+
this -> length ++;
95+
return true;
96+
}
97+
98+
bool LinkedList::InsertElemAtBack(int elemVal) {
99+
ListNode *newNode = new ListNode();
100+
newNode -> val = elemVal;
101+
ListNode *end;
102+
for (end = this -> head; end -> next != nullptr; end = end -> next);
103+
end -> next = newNode;
104+
newNode -> next = nullptr;
105+
this -> length ++;
106+
return true;
107+
}
108+
109+
void LinkedList::PrintList() {
110+
ListNode *elem;
111+
printf("List: ");
112+
for (elem = this -> head -> next; elem -> next != nullptr; elem = elem -> next) {
113+
printf("%d - ", elem -> val);
114+
}
115+
printf("%d\n", elem -> val);
116+
}
117+
118+
#endif
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* Author: TripleZ<[email protected]>
3+
* Date: 2018-10-10
4+
* Brief: ListNode class.
5+
*/
6+
7+
#ifndef _LISTNODE_HPP_
8+
#define _LISTNODE_HPP_
9+
10+
class ListNode {
11+
public:
12+
int val;
13+
ListNode *next;
14+
};
15+
16+
#endif
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/**
2+
* Author: TripleZ<[email protected]>
3+
* Date: 2018-10-10
4+
* Brief: Check a list whether is palindrome.
5+
*/
6+
7+
#include <cstdio>
8+
#include "LinkedList.hpp"
9+
10+
bool CheckPalindromeList(LinkedList *list) {
11+
// 使用快慢指针找链表中点
12+
ListNode *slow, *fast, *mid2;
13+
slow = list -> head;
14+
fast = list -> head;
15+
while (fast -> next != nullptr) {
16+
slow = slow -> next;
17+
fast = fast -> next;
18+
if (fast -> next != nullptr) {
19+
fast = fast -> next;
20+
mid2 = slow -> next;
21+
} else {
22+
mid2 = nullptr;
23+
}
24+
}
25+
26+
// 从中点向后逆转链表(区分奇偶情况)
27+
ListNode *mid = slow;
28+
ListNode *elem, *prev, *save;
29+
if (mid2 == nullptr) { // odd
30+
elem = mid;
31+
prev = mid -> next;
32+
} else { // even
33+
elem = mid2;
34+
prev = mid2 -> next;
35+
mid2 -> next = nullptr;
36+
}
37+
save = prev -> next;
38+
mid -> next = nullptr;
39+
while (save != nullptr) {
40+
prev -> next = elem;
41+
elem = prev;
42+
prev = save;
43+
save = save -> next;
44+
}
45+
prev -> next = elem;
46+
47+
ListNode *end = prev;
48+
ListNode *front = list -> head -> next;
49+
50+
// 从头尾同时遍历比较,检测链表是否为回文
51+
bool palindrome = true;
52+
while (front != end) {
53+
// printf("%d, %d\n", front -> val, end -> val);
54+
if (front -> val != end -> val) {
55+
palindrome = false;
56+
break;
57+
}
58+
front = front -> next;
59+
end = end -> next;
60+
}
61+
62+
palindrome ? printf("The list is palindrome~\n") : printf("The list is not palindrome!\n");
63+
64+
return palindrome;
65+
}
66+
67+
int main(int argc, char const *argv[]) {
68+
69+
int init[] = {1, 2, 3, 2, 1};
70+
LinkedList *list = new LinkedList(5);
71+
for (int i = 0; i < 5; i++) {
72+
list -> InsertElemAtBack(init[i]);
73+
}
74+
list -> PrintList();
75+
76+
CheckPalindromeList(list); // true
77+
78+
list -> InsertElemAtFront(5);
79+
CheckPalindromeList(list); // false
80+
81+
82+
int init2[] = {1, 2, 3, 3, 2, 1};
83+
LinkedList *list2 = new LinkedList(10);
84+
for (int i = 0; i < 6; i++) list2 -> InsertElemAtBack(init2[i]);
85+
list2 -> PrintList();
86+
CheckPalindromeList(list2);
87+
88+
list2 -> InsertElemAtBack(4);
89+
CheckPalindromeList(list2);
90+
91+
return 0;
92+
}

c-cpp/07_linkedlist/linked_list.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* 单链表
3+
*
4+
* Author: Liam Huang (Liam0205)
5+
*/
6+
7+
#ifndef LINKEDLIST_LINKED_LIST_H_
8+
#define LINKEDLIST_LINKED_LIST_H_
9+
10+
#include <memory>
11+
12+
template <typename T>
13+
struct Node {
14+
using ptr_t = std::shared_ptr<Node<T>>;
15+
T data;
16+
ptr_t next;
17+
18+
Node(T data_) : data(data_), next(nullptr) {}
19+
Node() : next(nullptr) {}
20+
};
21+
22+
#endif // LINKEDLIST_LINKED_LIST_H_

0 commit comments

Comments
 (0)