主要总结单链表反转的几种方法
第一种方法貌似是递归,不太懂,第二种方法使用三个指针逐一完成逆置
结构体定义: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;
- }