主要总结单链表反转的几种方法
第一种方法貌似是递归,不太懂,第二种方法使用三个指针逐一完成逆置
结构体定义:class ListNode { int val; ListNode next; ListNode(int x) { //这步没看懂,是结构体里引用了自己吗 val = x; next = null; } }
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 = pCur.next;//prev指针指向3 prev指向4 11 pCur.next = dummy.next;//pcur指针指向1 pcur指向2 12 dummy.next = pCur;//dummy指针指向2 dummy指向3 13 pCur = prev.next;//pcur指向3 pcur指向4 14 }//一步一步看得懂,但是不明白总体的动态过程是怎样的,一个个往后指怎么完成逆置 15 return dummy.next; 16 }
总结:
- 不明白结构体里的引用是什么意思
- 不明白整个函数是如何动态完成逆置的
使用3个指针遍历单链表,逐个链接点进行反转。
- ActList* ReverseList2(ActList* head)
- {
- //ActList* temp=new ActList;
- if(NULL==head|| NULL==head->next) return head; //少于两个结点则不反转
- ActList* p;
- ActList* q;
- ActList* r;
- p = head;
- q = head->next;
- head->next = NULL;//使头结点指向空
- while(q){
- r = q->next; //记录第三个结点
- q->next = p; //将第二个结点指向第一个,完成逆置
- p = q;
- q = r; //三个结点同时后移
- }
- head=p;//使头结点重新指向头部
- return head;
- }
原文地址:https://www.cnblogs.com/cxxxxxx/p/10596363.html
时间: 2024-10-11 16:57:25