对于面试时,链表的反转是高频题目。以下是我对链表反转的理解,采用的是原地反转,没有借助辅助链表。
具体操作如下:(举例说明)
-
第一步:初始化工作
将链表表头设置为node;
表头的下一个节点为cur;
设置一个新的节点用于储存cur的下一个节点,初始设为null;(虽然不是将node.next设置为7的下一个节点null,但是这样理解有助于解决局部单链表反转问题)
将node.next设置成null(这里是因为表头元素反转之后为链表末尾)
-
反转具体操作
将cur.next用next保存;next=cur.next;
将cur.next设置成node;cur.next=node;
然后令node=cur;
继续遍历,将保存的next重新赋值给cur;
一轮循环之后,就使得2这个节点为1节点的父节点,一直循环下去,直到cur为null。至此链表反转也就结束了。
下面贴上代码
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public ListNode ReverseList(ListNode head) {
//对不符合规定的head直接原地返回
if(head==null||head.next==null){
return head;
}
ListNode node=head;
ListNode cur=node.next;
ListNode next=null;//保存cur节点的下一个节点
node.next=null;
while(cur!=null){
next=cur.next;
cur.next=node;
node=cur;
cur=next;
}
return node;
}