链表-常见题
Posted hzk-note
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表-常见题相关的知识,希望对你有一定的参考价值。
struct Node { int _data; Node *_next; };
逆序:
1)修改指向:效率较低
1 Node* reverseList(Node *head) { 2 if (head == 0) return head; 3 Node *p = head->_next; 4 if (p == 0) return head; 5 Node *q = head, *tmp; 6 while (p) { 7 tmp = p->_next; 8 p->_next = q; 9 q = p; 10 p = tmp; 11 } 12 head->_next = 0; 13 return q; 14 }
2)栈存储值,然后修改节点值
1 Node* reverseList2(Node *head) { 2 if (head == 0) return head; 3 Node *p = head; 4 stack<int> s; 5 while (p) { 6 s.push(p->_data); 7 p = p->_next; 8 } 9 p = head; 10 while (!s.empty()) { 11 p->_data = s.top(); 12 p = p->_next; 13 s.pop(); 14 } 15 return head; 16 }
判断链表是否有环:快慢指针
1 bool hasCycle(ListNode *head) { 2 if (head == nullptr) return false; 3 4 ListNode *fast, *slow; 5 fast = slow = head; 6 7 do { 8 fast = fast->_next; 9 if (fast == nullptr) return false; 10 fast = fast->_next; 11 12 slow = slow->_next; 13 14 } while (fast && fast != slow); 15 16 if (fast == nullptr) return false; 17 return true; 18 }
约瑟夫问题:省略
以上是关于链表-常见题的主要内容,如果未能解决你的问题,请参考以下文章