单链表就地逆转

template<typename LinkList>
void converse(LinkList*L)
{
	LinkList *p, *q;
	p = L->next;
	L->next = NULL;
	while (p)
	{
		q = p;
		p = p->next;
		q->next = L->next;
		L->next = q;
     }
}

  

时间: 2024-11-07 09:41:59

单链表就地逆转的相关文章

单链表的逆转

算法导论:10.2-7 给出一个 O(n) 时间的非递归过程,实现对一个含有 n 个元素的单链表的逆转.要求除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间. #ifndef _SINGLY_LINKED_LIST_H #define _SINGLY_LINKED_LIST_H /*********************************************************** 10.2-7 单链表类,并实现了在 O(n) 时间内链表的逆转 ***********

PTA 单链表分段逆转

6-9 单链表分段逆转 (25 分) 给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4:如果 K=4,则应该得到 4→3→2→1→5→6. 函数接口定义: void K_Reverse( List L, int K ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data;

单链表就地逆置

题目:有一个线性表(a1,a2,a3,...,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置,线性表变为(an,...a3,a2,a1).所谓"就地"指辅助存储空间为O(1). 解题思路: 如果是顺序存储的话,我们很容易想到解题思路,利用1个辅助变量让第1个元素与第n个元素交换,然后再利用这个辅助变量让第2个元素与第n-1个元素交换,...最后利用这个辅助变量让第n/2个元素与第n+1-n/2个元素交换. 如果不要求"就地"的话,可以创建一个n个元素辅

单链表就地逆置(Java版)

题目:有一个线性表(a1,a2,a3,...,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置,线性表变为(an,...a3,a2,a1).所谓"就地"指辅助存储空间为O(1). 解题思路: 如果是顺序存储的话,我们很容易想到解题思路,利用1个辅助变量让第1个元素与第n个元素交换,然后再利用这个辅助变量让第2个元素与第n-1个元素交换,...最后利用这个辅助变量让第n/2个元素与第n+1-n/2个元素交换. 如果不要求"就地"的话,可以创建一个n个元素辅

线性表之顺序表奇偶调整和单链表就地逆置

线性表之顺序表奇偶调整,就是指将顺序表的奇数与偶数位置互换,以最优方法解决,因为方法很多,比如,开辟一个新的顺序表分别存放奇偶数,也可以从头向后寻找奇偶数放置到尾部或头部,但这些都会增大时间与空间的消耗.最优法则是前后分别寻找奇偶不同类型数,满足前奇后偶(或前偶后期),交换两数位置,实现时间复杂度O(n),空间O(1)的方案. void AdjustSqlist(SeqList *L) { int i=0,j=L->last; int temp; while(i<j) { while(L-&g

数据结构单链表就地排序

void LinListSort(LinList<T> &L) { ListNode<T> *curr, *pre, *p, *q; p = L.head->next; //原单链表L.head->next = NULL; //新单链表 while(p != NULL) { curr = L.head->next; pre = L.head; while(curr != NULL && curr->data <= p->d

两种方法(递归,非递归)实现单链表的逆转

//普通方法实现链表的逆置 void reverseList(pNode *head) { pNode p, q, r; if (*head == NULL || (*head)->next == NULL) return; q = *head; p = q->next; r = NULL; while (p){ q->next = r; r = q; q = p; p = p->next; } q->next = r; *head = q; } //递归法实现链表的逆置 p

【算法设计-单链表的逆转】单链表逆转实现

1.在Θ(n)时间内将链表转置,而且只能需要少量的额外空间 这里需要用3个指针使得q指向p然后依次后移. 代码: #include<iostream> using namespace std; typedef struct Node { int data; struct Node *next; }LinkList; LinkList* Create_End(); void printLinkList(LinkList *L); LinkList* Create_End() { LinkList

单链表就地反转

1 // 1.就地反转法 2 public ListNode reverseList1(ListNode head) { 3 if (head == null) 4 return head; 5 ListNode dummy = new ListNode(-1); 6 dummy.next = head; 7 ListNode prev = dummy.next; 8 ListNode pCur = prev.next; 9 while (pCur != null) { 10 prev.next