Skip to content

Commit 0bdac9d

Browse files
committed
code about list
1 parent 4bc86fc commit 0bdac9d

4 files changed

+177
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
typedef struct Node {
2+
int value;
3+
Node* next;
4+
5+
Node( int data ) {
6+
this.value = data;
7+
}
8+
} Node;
9+
10+
Node* removeMidNode( Node* head ) {
11+
if( head == NULL || head->next == NULL ) {
12+
return head;
13+
}
14+
if( head->next->next == NULL ) {
15+
return head->next;
16+
}
17+
18+
Node* pre = head;
19+
Node* cur = head->next->next;
20+
while( cur->next != NULL && cur->next->next != NULL ) {
21+
pre = pre->next;
22+
cur = cur->next->next;
23+
}
24+
Node* mid = pre->next;
25+
pre->next = pre->next->next;
26+
delete mid;
27+
mid = NULL;
28+
29+
return head;
30+
}
31+
32+
Node* removeByRatio( Node* head, int a, int b ) {
33+
if( a < 1 || a > b ) return head;
34+
35+
int len = 0;
36+
Node* cur = head;
37+
while( cur != NULL ) {
38+
len++;
39+
cur = cur->next;
40+
}
41+
42+
int pos = (int)ceil( ((double)( a * n ) ) / (double)b );
43+
if( pos == 1 ) {
44+
head = head->next;
45+
}
46+
else if( pos > 1 ) {
47+
cur = head;
48+
while( --pos != 1 ) {
49+
cur = cur->next;
50+
}
51+
cur->next = cur->next->next;
52+
}
53+
54+
return head;
55+
}

2-4.反转单向和双向链表.cpp

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
typedef struct Node {
2+
int value;
3+
Node* next;
4+
5+
Node( int data ) {
6+
this.value = data;
7+
}
8+
} Node;
9+
10+
Node* reverseList( Node* head ) {
11+
Node* pre = NULL;
12+
Node* next = NULL;
13+
while( head != NULL ) {
14+
next = head->next;
15+
head->next = pre;
16+
pre = head;
17+
head = next;
18+
}
19+
20+
return pre;
21+
}
22+
23+
24+
25+
typedef struct DoubleNode {
26+
int value;
27+
DoubleNode* next;
28+
DoubleNode* last;
29+
DoubleNode( int data ) {
30+
this.value = data;
31+
}
32+
} DoubleNode;
33+
34+
DoubleNode* reverseList( DoubleNode* head ) {
35+
DoubleNode* pre = NULL;
36+
DoubleNode* next = NULL;
37+
while( head != NULL ) {
38+
next = head->next;
39+
head->next = pre;
40+
head->last = next;
41+
pre = head;
42+
head = next;
43+
}
44+
45+
return pre;
46+
}

2-5.反转部分单链表.cpp

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
typedef struct Node {
2+
int value;
3+
Node* next;
4+
5+
Node( int data ) {
6+
this.value = data;
7+
}
8+
} Node;
9+
10+
Node* reversePart( Node* head, int from, int to ) {
11+
int len = 0;
12+
Node* node1 = NULL;
13+
Node* fPre = NULL;
14+
Node* tPos = NULL;
15+
while( node1 != NULL ) {
16+
len++;
17+
fPre = len == from - 1 ? node1 : fPre;
18+
tPos = len == to + 1 ? node1 : tPos;
19+
node1 = node1->next;
20+
}
21+
if( from > to || from < 1 || to > len ) return head;
22+
23+
node1 = fPre == NULL ? head : fPre.next;
24+
Node* node2 = node1->next;
25+
node1>next = tPos;
26+
Node* next = NULL;
27+
while( node2 != tPos ) {
28+
next = node2->next;
29+
node2->next = node1;
30+
node1 = node2;
31+
node2 = next;
32+
}
33+
if( fPre != NULL ) {
34+
fPre->next = node1;
35+
return head;
36+
}
37+
return node1;
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
typedef struct Node {
2+
int value;
3+
Node* next;
4+
5+
Node( int data ) {
6+
this.value = data;
7+
}
8+
} Node;
9+
10+
Node* josephusKill( Node* head, int m ) {
11+
if( head == NULL || head->next == head || m < 1 ) return head;
12+
13+
Node* last = head;
14+
while( last->next != head ) {
15+
last = last->next;
16+
}
17+
int count = 0;
18+
while( head != last ) {
19+
if( ++count == m ) {
20+
last->next = head->next;
21+
count = 0;
22+
}
23+
else {
24+
last = last->next;
25+
}
26+
head = last->next;
27+
}
28+
29+
return head;
30+
}
31+
32+
33+
34+
35+
36+
37+
38+

0 commit comments

Comments
 (0)