一、单向链表
1. 排序(插入升序):
假设所给的链表为不带头节点的链表,由于不带头节点的链表很难操作,首先将其添加一个头节点headNode。具体操作如下
void sortLinkList(Node *&head) { // ascend
Node *headNode = new Node();
headNode->next = head;
if (head != NULL) {
Node *curr = head->next;
head->next = NULL;
while (curr != NULL) {
Node *befo = headNode, *tmp = curr->next;
while (befo->next!=NULL && befo->next->val<=curr->val) {
befo = befo->next;
}
curr->next = befo->next; //befo之后即为要插入的位置
befo->next = curr;
curr = tmp;
}
head = headNode->next;
free(headNode);
}
}
同排序,先加上个头节点方便操作。
void reverseLinkList(Node *&head) {
Node *nextNode = head->next;
head->next = NULL;
while(nextNode != NULL) {
Node *tmp = nextNode->next;
nextNode->next = head;
head = nextNode;
nextNode = tmp;
}
}
二、双向链表插入交换操作(带有头节点的):
问题描述:假设一个节点的数据结构如下,其中val为节点的值,freq为该节点的访问量。
struct DNode {
int val;
int freq;
DNode *pre;
DNode *next;
DNode(int x=0) : val(x), freq(0), pre(NULL), next(NULL) {}
};
bool findDNode(DNode *&head, int elem) {
DNode *curr = head->next;
while(curr!=NULL && curr->val!=elem) {
curr = curr->next;
}
if (curr == NULL) return false;
curr->freq++;
DNode *currPre = curr->pre;
while(currPre!=head && currPre->freqfreq) {
curr->pre = currPre->pre; // new curr pre 更新当前结点的前驱
curr->pre->next = curr; // update the new curr pre's next to curr 更新新的前驱的后继为当前结点
currPre->next = curr->next; // update the old curr pre's next to curr's old next 更新旧的前驱节点的后继为当前结点的旧的后继
if (currPre->next != NULL) {
currPre->next->pre = currPre;
}
curr->next = currPre; // make the old curr pre to curr's new next 当前节点的后继更新为旧的前驱
currPre->pre = curr; // update the new curr's next(the curr's old pre)'s pre to curr 新的后继的前驱为当前结点
currPre = curr->pre; // update currPre
}
return true;
}
运行结果如下:
5
1 2 3 4 5
please input the Node you want to visit:
5
(5, 1)->(1, 0)->(2, 0)->(3, 0)->(4, 0)
3
(5, 1)->(3, 1)->(1, 0)->(2, 0)->(4, 0)
1
(5, 1)->(3, 1)->(1, 1)->(2, 0)->(4, 0)
1
(1, 2)->(5, 1)->(3, 1)->(2, 0)->(4, 0)
2
(1, 2)->(5, 1)->(3, 1)->(2, 1)->(4, 0)
3
(1, 2)->(3, 2)->(5, 1)->(2, 1)->(4, 0)
3
(3, 3)->(1, 2)->(5, 1)->(2, 1)->(4, 0)
4
(3, 3)->(1, 2)->(5, 1)->(2, 1)->(4, 1)
4
(3, 3)->(1, 2)->(4, 2)->(5, 1)->(2, 1)
4
(3, 3)->(4, 3)->(1, 2)->(5, 1)->(2, 1)
4
(4, 4)->(3, 3)->(1, 2)->(5, 1)->(2, 1)
未完待补充(不复习东西都忘完了......)